標籤:優勢 gtk 不同的 cat nbsp man 第一個 tput and
PHP 的命令列模式
從版本 4.3.0 開始,PHP 提供了一種新類型的 CLI SAPI(Server Application Programming Interface,服務端應用編程連接埠)支援,名為 CLI,意為 Command Line Interface,即命令列介面。顧名思義,該 CLI SAPI 模組主要用作 PHP 的開發外殼應用。CLI SAPI 和其它 CLI SAPI 模組相比有很多的不同之處,我們將在本章中詳細闡述。值得一提的是,CLI 和 CGI 是不同的 SAPI,儘管它們之間有很多共同的行為。
PHP-CLI模式的優勢及使用場合
完全支援多線程
實現定時任務
開發案頭應用就是使用PHP-CLI和GTK包
linux下用php編寫shell指令碼
PHP 的命令列模式擴充
其實PHP的運行環境遠遠不止apache和cli,如aolserver, apache, apache2filter, apache2handler, caudium, cgi (until PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, and webjames.可以用php_sapi_name()這個函數去檢測,這裡只檢測Apache伺服器和Windows CMD擴充,下面編寫一個cli.php檔案進行測試:
<?phpecho "PHP current cli mode :".php_sapi_name();
Windows cmd命令列模式運行結果:
在Apache伺服器模式下運行結果:
PHP 的命令列自變數
和所有的外殼應用程式一樣,PHP 的二進位檔案(php.exe 檔)及其啟動並執行 PHP 指令碼能夠接受一系列的參數。PHP 沒有限制傳送給指令碼程式的參數的個數(外殼程式對命令列的字元數有限制,但通常都不會超過該限制)。傳遞給指令碼的參數可在全域變數 $argv 中擷取。該數組中下標為零的成員為指令碼的名稱(當 PHP 代碼來自標準輸入獲直接用 -r 參數以命令列方式運行時,該名稱為“-”)。另外,全域變數 $argc 存有 $argv 數組中成員變數的個數(而非傳送給指令碼程式的參數的個數)。
PHP CLI帶有兩個特殊的變數,專門用來達到這個目的:一個是$argv變數,它通過命令列把傳遞給PHP指令碼的參數儲存為單獨的數組元素;另一個是$argc變數,它用來儲存$argv數組裡元素的個數。
建立一個測試檔案cli.php:
<?phpecho "argv:".print_r($argv)."\r\n";echo "argc:".$argc;
測試結果如下所示:
瞭解更多,請參考官方手冊:http://php.net/manual/zh/features.commandline.php
PHP的exec()函數無傳回值排查方法
exec執行某命令在命令列下沒有問題,但是在PHP中就出錯。這個問題99.99%與許可權有關,但是exec執行的命令不會返回錯誤。一個技巧就是使用管道命令,假設你的exec調用如下:
exec(‘convert a.jpg b.jpg‘, $output, $return_val);
可以更改如下:
exec(‘convert a.jpg b.jpg 2>&1‘, $output, $return_val); print_r($output);
使用 2>&1, 命令就會輸出shell執行時的錯誤到$output變數, 輸出該變數即可分析。
備忘: exec有3個參數,第一個是要執行的命令,第二個是參數是一個數組,數組的值是由第一個命令執行後產生的,第三個參數執行的狀態,0表示成功,其他都表示失敗。
在php裡面一共有三個函數可以用來執行外部命令system,exec,passthru。
php cli模式