發表文章

目前顯示的是有「php」標籤的文章

耍廢文之裝裝老程式

 最近在移植老程式到新的舊平台上撞上的南(難)牆(強),不管環境怎麼調校就是給你一片空白,這是最嚇人的,因為沒有訊息就沒辦法除錯。  好在喝了一些糖水,腦袋瓜子突然磞出,是不是之前有用了什麼特別的套件… 工作環境:     Ubuntu Server 22 TLS          docker: lamp stack               PHP5.5               pear packages...   想那時,pear install package 就搞定了,重裝時也是幾分鐘的事 果然開始想那時就是老了,程式老了,人也老了,pear 不給裝套件了 好在,當初設計 pear 的神人留了一條後路  所以把要裝的 package.tgz 全部下載下來: curl -o package.tgz http://pear.php.net/somewhere/package.tgz  再手動裝起來: pear install --offline package.tgz 好在選的這個 docker 容器有 pear 可以用,不然不知道還要搞多久 暫時過關     收工!

PHP 重新導向失效修復

 最近,把以前的程式拿出來,準備移植到新的舊平台上,怎麼說呢?程式很舊,用的環境很舊,偏偏作業系統很新,而程式很老,只能用老的套件,這有什麼問題嗎?問題就在新的作業系統本身不提供老的套件,也就是說,老程式就算會跳舞也沒舞臺了 另外還發現人也老了…還有就是修舊如舊也是得花很多工夫的… 能修好嗎?問題是 工作環境:   Ubuntu Server 22 LTS     docker: lamp stack          PHP 5.5  光是修這個重新導向可能就要花好多功了,因為之前寫的時侯用了很多跳轉的做法  找到了個不用自已折騰那麼多的做法,把要跳轉的部份從原本的 header(Location: ...) 換成 redirect_rel($relative_url) 就行了 function server_url () {       $proto = "http" .         (( isset ( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] == "on" ) ? "s" : "" ) . "://" ;     $server = isset ( $_SERVER [ 'HTTP_HOST' ]) ?         $_SERVER [ 'HTTP_HOST' ] : $_SERVER [ 'SERVER_NAME' ];     return $proto . $server ; }     function redirect_rel ( $relative_url ) {     $url = server_url () . dirname ( $_SERVER [ 'PHP_SELF' ]) . "/" . $relative_url ;     if (! headers_sent ())   ...

symfony var-dumper 和 php 的除錯工具 whoops

 PHP 的除錯,借助最基本的 echo print_r 已久,雖然早有除錯工具,像是 Xdebug 之類,總覺得在部署上不是很直覺,在使用 Laravel 的時侯,覺得它的除錯工具不錯,就是訊息好多,繞來繞去的,有時侯反而模糊了焦點,但是,不是什麼東西都需要拿 Laravel 出來用的,這時侯又想回頭去試試 Laravel 的除錯工具了。 工作環境:   PHP     flip/whoops     symfony/var-dumper 安裝很直覺 composer require symfony/var-dumper composer require filp/whoops 引用要花點工夫 $debug = TRUE ; $debug = FALSE ; # Composer 自動載入 require_once __DIR__ . "/vendor/autoload.php" ; if ( $debug ){     # Whoops     $whoops = new \Whoops\ Run ;     $whoops -> pushHandler ( new \Whoops\Handler\ PrettyPageHandler );     $whoops -> register ();     error_reporting (E_ALL); } else {     error_reporting ( 0 ); } 連追蹤時的 echo 也不想打了 function dumpVar ( $var ) {   //有開 whoops 時使用   foreach ( $GLOBALS as $var_name => $value ) {       if ( $value === $var ) {           echo $var_name ;         ...

PHP beep

 PHP 定位為伺服器端作用,所以使用端要發出聲音,還是折騰了一下,好在還是能透過網頁來完成。 作業環境:   windows 10   php   html   播放用的聲音檔 結果: <audio controls autoplay loop><source src="Christmas.mp3"></audio> 或者 function   beep ( $controls = 'controls' , $autoplay = 'autoplay' , $loop = 'loop' , $source = 'inc/Christmas.mp3' ){      return   '<audio '   .   $controls   .   ' '   .   $autoplay   .   ' '   .   $loop   .   '><source src="'   .   $source   .   '"></audio>' ; } echo   beep (); 如果沒有自動播放聲音檔可能是瀏覽器不允許自動播放,請參考  自動播放音訊也能踩坑 audio autoplay not working solved 收工! --------------------------------- 一些沒有成功的 --------------------------------- beep(2); 沒有這個函式 echo chr(7); 沒有反應 function beep() {     fprintf ( STDOUT, "%s", "\x07" ); } 不存在 STDOUT exec("mpg321 --q...

laravel 既有資料的 seed 產生器

laravel 的 migrate 工具可以讓我們產生相應的資料庫,讓使用者輸入資料到資料庫中。 有別於透過 sql 檔案來匯入資料庫中的資料,laravel 提供了 (db:)seed 讓我們把資料匯入資料庫中。 那要怎麼產生 seed 要用的內容呢? 這裏指的是要把預設的、指定的資料內容填入資料庫,而不是用 factory 來產生隨機資料的情境。 既然有 seed 指令就是可以手寫相關的檔案,就像是 https://laravel.tw/docs/5.2/seeding 提到的,建個 seed 檔案來填相應欄位的資料,再用 DatabaseSeeder.php 來呼叫所有的 seed 檔,或是透過指令 php artisan db:seed --class=UserTableSeeder 來執行指定的 seed 檔。 想當然爾「不想手動」,那就來找個工具。 工作環境:   laravel 7.*   iseed 2.6.4 https://github.com/orangehill/iseed   安裝 iseed: $composer require orangehill/iseed 產生 seed 檔/匯出資料庫中的資料: $php artisan iseed my_table,another_table,users database/seeds 下會生成相對應的 seed 檔案 匯入 users 資料庫中的資料: $php artisan db:seed --class=UserTableSeeder 或是匯入所有的資料: $php artisan db:seed 如果安裝時出現記憶體不足 Fatal error: Allowed memory size of ########## bytes exhausted 請見這裏

composer 安裝套件出現記憶體不足的情形排除

在很少見的情形下,用 composer 安裝套件時出現記憶體不足的狀況,安全性的考量在此先略過不談,單就處理安裝的角度來處理排除的工作。 症狀: Fatal error: Allowed memory size of ########## bytes exhausted 工作環境:   php 7.3   composer require iseed   確認記憶體設定值:     $php -r "echo ini_get('memory_limit').PHP_EOL;" 試著在這個工作階段略過記憶體設定值的限制:     $composer COMPOSER_MEMORY_LIMIT=-1 require orangehill/iseed    (我失敗了)     $php -d memory_limit=-1 composer.phar require orangehill/iseed    (我失敗了)     $php composer.phar COMPOSER_MEMORY_LIMIT=-1 require orangehill/iseed (我失敗了)     $COMPOSER_MEMORY_LIMIT=-1 composer require orangehill/iseed (我失敗了)          $set COMPOSER_MEMORY_LIMIT=-1     $composer require orangehill/iseed     終於成功!      收工!

laragon 建置可攜本機開發環境

搞一個不折騰的開發環境是最近的目標,有點折騰,不過,為了以後不折騰,先稍稍折騰一下 laragon 。 工作環境:   Windows 10   laragon portable V4 nginx 新增了 laravel 的程式之後,會以 appName 做為網址,預設會在 appName.test 如果不愛 .test 請到右上角有個齒輪形狀(設定) > General > Auto virtual hosts > Hostname: 輸入你愛的網域名稱,例如:{name}.love ,之後,就可以連到 appName.love ,很方便啊,網址又好看。 php7 +# PHP +php=https://windows.php.net/downloads/releases/php-7.3.11-Win32-VC15-x64.zip Menu > Quick App > Configuration+# Laravel +Laravel=composer create-project --prefer-dist laravel/laravel %s 現在開始可以: Menu > Quick App > Laravel > appName > 然後就裝了 laravel ,而且設好了 appName.test 這個網站可以連上去用。 MySQL 5.7 至少昇級到這個版本吧,不然 phpmyadmin 一直報錯 error 200,要不就連線中斷。 Menu > Tools > Quick Add > mysql-5.7 Menu > MySQL > version > mysql-5.7 很重要!很重要!很重要! 如果要為 root 設定 password 一定要從 Menu > MySQL > change root password 改,不然會出現很難搞的狀況, MySQL 重啟後就進不去了! Laravel: 如果遇到沒有 autoload.php 這個檔案,記得去 appName 下 composer install 一下。 Warning: require(...

php composer 的安裝方式更新

印象中 composer 很好裝的,怎麼官網的說明變得多了,卻也感覺讓一個簡單的安裝變得複雜,做為開源工具的使用者,又要開始游牧了,這種生態好像就像是開源工具使用者的 DNA ,自然就難以擺脫游魂一般的命運了 如果直覺的依據官網提供的裝法其實很簡單:把這裏的4行複製貼上到終端機的命令列中: https://getcomposer.org/download/ $cd --------- $php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" $php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" $php composer-setup.php $php -r "unlink('composer-setup.php');" --------- 又參考這個:https://www.digitalocean.com/community/tutorials/how-to-install-and-use-composer-on-ubuntu-18-04 一步一步跟著作也可以裝好 But, 人就是懶又貪,還看到官網寫著,可以用程式來安裝,在這裏: https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md  得再多試幾次,我真是愛自找麻煩的傢伙 工作環境: Windows 10 ...

composer 安裝 laravel error Permission denied

為了要安裝 laravel,因為對於 vagrant 、 docker 這些工具都不熟悉,只能手動建置平台,也就因此遇到一些前人已經處理完的問題,這次是權限問題 $composer global require laravel/installer   [ErrorException]   file_put_contents(./composer.json): failed to open stream: Permission denie   d 因為權限的問題,所以在本機用非 root 帳號使用 composer 時,出現了以上的錯誤訊息,但是 composer 也不建議用 root 帳號安裝,那麼得來處理一下這個權限問題。 $sudo chown -R $USER.$USER ~/.composer/ 再裝一次 laravel $composer global require laravel/installer 應該就可以了

composer 安裝 laravel error ext-zip

試著不用 homestead, docker 這些工具,自行安裝 laravel, 之前已經安裝完成了 composer 接著就是要安裝 laravel 了,根據官網的說明,只要滿足一些套件就可以了,     PHP >= 7.1.3     OpenSSL PHP Extension     PDO PHP Extension     Mbstring PHP Extension     Tokenizer PHP Extension     XML PHP Extension     Ctype PHP Extension     JSON PHP Extension 工作環境:   Windows 10 + virtualbox   guest: ubuntu 18 server $composer global require laravel/installer error:   ext-zip * -> the requested PHP extension zip is missing from your system ... 應該是要安裝 php-zip 或是 phpVersion-zip ,但是,找不到 @@" 這時侯,請更新 /etc/apt/source.list (請記得先備份哦) $vim  /etc/apt/source.list 加上 universe 類別的套件  ---------- deb http://archive.ubuntu.com/ubuntu bionic main universe deb http://archive.ubuntu.com/ubuntu bionic-security main universe deb http://archive.ubuntu.com/ubuntu bionic-updates main universe  -------...

Ubuntu 18 MySQL root 帳密設定

在 Ubuntu 18 server 安裝了 phpmyadmin 結果 root 帳密無法登入,會出現類似 root 帳號不能空白。 工作環境:   Windows 10 + virtualbox   guest: Ubuntu 18 server 用 root 登入 mysql: $ sudo su - $ mysql -uroot 確認你的使用者在資料庫中 mysql> SELECT User,Host FROM mysql.user; +------------------+-----------+ | User                  | Host      | +------------------+-----------+ | admin               | localhost | | root                  | localhost | 設定你的密碼 mysql> UPDATE user SET authentication_string=PASSWORD("YOUR_PASSWORD") WHERE User='root'; 改認證方式 mysql> UPDATE user SET plugin="mysql_native_password" WHERE User='root'; 最用權限 mysql> FLUSH PRIVILEGES; =================== 如果已經被改到進不去資料庫的解法 $ sudo service mysql stop $ sudo mkdir -p /var/run/mysqld $ sudo chown mysql:mysql /var/run/mysqld $ sudo /usr/sbin/mysqld --skip-grant-tables --skip-network...

barcode printer 使用 php socket 列印

話說,條碼印表機實在很神秘,要讓它印個條碼非得透過特定應用程式不可,這次很幸運可以試著自已把東東印出來,透過之前從沒用過的 socket ,socket 這東東看了半天也看不懂是個什麼東西 ,不過本著一貫在不解中摸黑,只問結果不求甚解的鴕鳥心態,就……試試。 $cht_string = "我要用中文"; $cht_string = iconv(mb_detect_encoding($cht_string), "UTF-8", $cht_string); $cht_big5 = iconv(mb_detect_encoding($cht_string), "BIG-5", $cht_string); $host = "1.2.3.4"; $port    = 9100; //default listening port for printer $message = ' Hello, world'.$cht_string.$cht_big5.' '; // create socket // 0, IP // SOL_TCP = specify protocol of TCP, UDP, FTP ... $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if(!$socket){     $errorcode = socket_last_error();     $errormsg = socket_strerror($errorcode);     socket_close($socket);    die("Could not create socket: [$errorcode] $errormsg\n"); } // connect to server $result = socket_connect($socket, $host, $port); if(!$result){         $errorcode = socket_last_error();       ...

再試 php 輸出 pdf

PHP 在輸出 pdf 的時侯有幾個網站上很有名的函式或說是工具,一個是 tcpdf ,姑且把它和 fpdf、dompdf、html2pdf 之類的工具歸在同一類,雖然除了 tcpdf 之外的我都沒試,因為太多人提到有字碼支援問題了;另一個是 wkhtmltopdf 這是 cli 終端機下的指令,用來將網頁轉成 pdf ,雖然個人並不喜歡這種工具用在網頁程式中,但是它的效果用起來真的很不錯,所以,這次先裝它來用,程式能動之後要改別的方式還不遲。 照著股溝大神指示的網站,很快就裝好這個 wkhtmltopdf ,指令很簡單, wkhtmltopdf.sh Input.html Output.pdf ,馬上就得到想要的 pdf 檔,眼都還沒眨呢! But... 又是那個 But ...,是的,中文亂碼又來攪局了,好在這次不是 tcpdf 上的空白,也不是方格,看起來就是字型的問題,檢查一下網頁,有指定是 utf-8 編碼(content="text/html; charset=utf-8"),問過大神之後,說要給個正確的字型檔,試著餵了幾個中文繁體的字型檔到 /usr/share/fonts/truetype/ 底下,挑個網頁長得美的就行。 終於收工了! 在被 tcpdf 搞了一天和 wkhtmltopdf 搞了半天之後…

在 php 使用 tcpdf 輸出 pdf 檔案卡關

作為開放源碼的 pdf 輸出程式 tcpdf 在網站上廣受好評,而且   提供許多的 範例   提供了網頁輸出到 pdf 檔案的函式   支援中文   支援 1D, 2D 條碼 ( barcode, qrcode) But ...   卡關了   在輸出表格的時侯   原本可以輸出中文的函式不行了,找不到解法,到處都是成功的網頁… 要再試一下,如果真的不行,只好繞道了,這次是不是文字型的 pdf  不重要…

將當前的 php 網頁輸出

php 一般來說用 ob_* 的函式可以處理當前的檔案輸出 ob_start — Turn on output buffering ob_get_contents — Return the contents of the output buffer ob_end_clean — Clean (erase) the output buffer and turn off output buffering 通常是: ob_start(); echo '要輸出的內容!'; $html1 = ob_get_contents(); echo '還有一些要輸出的內容!'; $html2 = ob_get_contents(); ob_end_clean(); var_dump($html1, $html2); // 輸出:    要輸出的內容!    要輸出的內容! 還有一些要輸出的內容! 但是我用了古早的 SMARTY 這個模版函式,所以 // 原本的顯示內容的網頁 $smarty -> display('show_me_my_page.tpl'); // 抓取原本的顯示內容的網頁的內容 $contents = $smarty -> fetch('show_me_my_page.tpl'); // 把抓取下來的內容存到 show_me_my_page.html file_put_contents('show_me_my_page.html', $contents); ============================ FAIL ============================ SMARTY: $contents = $smarty -> display('show_me_my_page.tpl'); file_put_contents('show_me_my_page.html', $contents);

PHP 抓取網頁內容筆記

最近實作抓取網頁內容,也遇到一些問題,為免那和我不好的記憶力和我分手,把重點記一下。 環境: Windows Php 5     Curl     Regular expression     Pho simple html dom 如同以往,抓取網頁之後就是要擷取特定模板(pattern) 內容,這個過程,一直以來並沒有不同。 有些情況發生了,雖然大多數的網頁用 GET 就能下載了( curl, file_get_html),有些網頁,要用 POST 方式,需要把 POST 參數代入(例如 curl: CURLOPT_POSTFIELDS),才能順利取得網頁的內容,否則一片空白,畢竟抓到這些資料來源,才能有下一步。 抓下來的資料,(十年)之前使用土法煉鋼的方式,用遁序漸進的方式,不斷的使用關鍵字炸開(explode)的方式,來取得目標的內容,雖然這等方式在現在也能達成目的,總是希望有點長進,果然,讀別人的程式碼是很有用地 XD。 如果時間上可行,測出正規表示法的比對模板,是很好的解決方式,不需要其他工具或是程式的導入,可惜,這些符號,和我真的很不熟(超生硬),有些真的花非常多的時間還測不出來,超需要慧根(是什麼,能吃嗎?),只能山不轉路轉了。 jQuery 對於擷取 DOM 有其長處,因為想直接在 PHP 上面實作,所以先把 jQuery 擱著,所幸找到了 simple html dom 的工具($html -> find(' TAG_NAME ', 0) -> plaintext;),讓這個工作變得有效率了,超級開心。 收工!

安裝 composer 的方式 更新

安裝 php 的套件管理工具:composer 現在變得更簡單了。 可以參照 https://getcomposer.org/download/ 的方式 因為我想要直接就把 composer 裝到 /usr/local/bin 底下,方便所有人使用,所以第3個步驟要修改(記得要用 sudo 不然沒有權限裝不上),或是裝在你有權限的PATH目錄(--install-dir)裏,因為我用自已的機器,所以就裝到/usr/local/bin裏了: php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php php -r "if (hash('SHA384', file_get_contents('composer-setup.php')) === '41e71d86b40f28e771d4bb662b997f79625196afcca95a5abf44391188c695c6c1456e16154c75a211d238cc3bc5cb47') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"  sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer php -r "unlink('composer-setup.php');" 之後只要下 composer 就能 composer 了。 composer 安裝比之前好搞了,收工!

Atom 程式碼編輯器

程式的開發者,例如:PHP 的開發者,PHPStorm 和 Sublime Text 相信常被提及用作開發的編輯器,前者是商用軟體,後者註冊後移除問侯視窗,當然還有 eclipse… 之類的PHP開發工具,不勝枚舉,這次發現的這款 Atom 編輯器 ,強大, 介紹也很有趣 。 Atom 是可以考慮的編輯器,雖然有些訊息指出,Atom 可能會耗用較多的系統資源,但是它具備很多上述編輯器的特質,跨平台,整合開發環境,支援多種程式語言,功能面大致上都已經具備,另外像是版面風格(配置字型、色彩)、自動完成提示、程式碼模版、版本管理、專案管理、外掛…等常用功能,都具備高度可自訂性,幫助使用者減少開發的時間。 用過發現,可以很快可以上手! 免費!馬上省下1xx美金,令人心動啊~~

php 套件管理使用 Composer

php 目前的套件管理趨勢是使用 composer,在使用 composer 的時侯,只要告訴 composer 你要使用的套件,有時侯要指定套件的版本,的維護是靠專案內的 composer.json 這個檔,也就是說,套件的資料夾如果被移除了,只要這個維護檔還在,要把套件裝回來,composer install 就行。 取得 composer     curl -sS https://getcomposer.org/installer | php 把 composer 放到可以取用的 path 中就裝好了     mv composer.phar /usr/local/bin/composer 或是     echo 'export PATH="$PATH:~/.composer/vendor/bin"' >> ~/.bashrc     source ~/.bashrc 如果是 windows 下     @set  COMPOSER_HOME=%WAGON_ROOT%composer     @set  PATH=%COMPOSER_HOME%vendorbin 舉例來說,在開發的時侯,找到一個可以用來產生測試資料用的套件叫作 Faker ,以往的動作是下載 faker,解壓縮到伺服器上,然後呼叫這個套件來使用,透過 composer 的話,只要在伺服器上下個指令 composer require fzaninotto/faker 就裝好,可以直接呼叫使用。 composer update: 昇級套件 composer self-update: 昇級 composer composer show -i 顯示目前安裝的 php 套件 global 安裝的方式,會將元件安裝在 composer_home 目錄底下,將 composer_home/vendor/bin 加入 PATH 後,即可全域使用該指令 composer global require vendor/package:version 安裝到正式機器上時 composer ins...

再探文字與檔案 xmpp 通訊伺服器 openfire

以 xmpp 通訊協定為運作基礎的 openfire 伺服器(server),用作私人的訊息交換平台,以其易於設定,後端操作界面容易上手,在股溝大神的搜尋結果中佔有一席之地,為了在封閉的內部網路環境中運作,再次回到 openfire 的懷抱,試著再次設置訊息交換環境,但是,使用執行檔安裝,要進後台的控制介面,在登錄時一直以失敗作收,直到使用 zip 壓縮檔來執行,才順利登入後台,覺得 openfire 功能開始有不穩定的狀況。 工作環境: Windows 7 64bit xmpp openfire 接著試著從用戶端(client)登入 openfire ,讓多個用戶端可以透過這個伺服器來交換訊息,在 pc、nb 當道之時,這樣傳送訊息和檔案的需求根本不成問題, xmpp 的用戶端選擇非常多,功能也很穩定,就在 server 後台無法登入之時,這些用戶端也一一以失敗告終,再次成功登入後台後,用戶端的部份得再重新試試;再者,現在平板設備當道,還有iOS、android 2種平台,要為這些用戶端連上伺服器,又增添變數,希望來日的測試順利。 雖然有想到了 IRC ,一探之下發現 IRC 伺服器雖然已經可以透過 DCC 來傳送檔案,但是沒有圖形管理介面,又是個之前完全沒接觸過不新的東西,風險畢竟是高,但是如果成功的話,伺服端似乎極為輕薄。 回到更原始的部份,或許,PHP + AJAX 的聊天室,也是不錯的選擇,網頁的平台如果順利測過,可以直接擺脫安裝 client 的束縛(這可是驚人的工作負荷),直接在共通性高的網頁上交換訊息和檔案,希望不要引起另一場混亂才好。 或許,或許,找出斷訊的真正原因,回歸診間系統,才是王道。