1. 程式人生 > >php cli模式的一些"坑"

php cli模式的一些"坑"

看下cli模式好使不
命令列下執行 php -r "echo php_sapi_name();"
這條命令就是在cli模式執行php語句,php -r就是run一條php命令的意思,php_sapi_name()判斷當前執行的php是什麼模式下,執行成功在螢幕上輸出 cli,不成功說明你的php cli模式有問題。

1第1個坑:Mysql連不上

命令列的ini路徑:

E:\x\pwashop2>php --ini
Configuration File (php.ini) Path: C:\Windows
Loaded Configuration File:         E:\x\wamp\bin\php\php-5.4.35-Win32-VC9-x86\php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)
網頁phpinfo();返回的路徑:
Configuration File (php.ini) Path 	C:\Windows
Loaded Configuration File 	E:\x\wamp\bin\apache\apache2.2.17\bin\php.ini
Scan this dir for additional .ini files 	(none)
Additional .ini files parsed 	(none) 

我是直接把E:\x\wamp\bin\php\php-5.4.35-Win32-VC9-x86\php.ini裡面的擴充套件開啟就可以了,並且將ext/擴充套件包移到了c盤(會提示缺少擴充套件檔案)下面。

這個問題網上很多人說cli模式沒載入php.ini,或者載入的和普通模式的不一樣。用php --ini可以檢視,我的是/etc/php5/cli/php.ini,而通過瀏覽器phpinfo() 看到的是 /usr/local/php/etc/php.ini,果然不一樣。
不過我感覺真正的問題在於php命令對應的執行檔案和普通模式執行的php不是一個檔案。執行which php,得到一個檔案路徑 /usr/bin/php,通常這是一個軟連結,執行ls -li /usr/bin/php 可以看到它的原始檔,原始檔可能也是一個連結檔案,就一直ls -li,直到找出最終檔案,我的是/usr/bin/php5,而普通CGI模式執行的是 /usr/local/php/bin/php。用ln -s把最後一個軟連結的原始檔設為普通模式執行的那個,這時再執行 php --ini發現載入的php.ini和瀏覽器的一致了。(或者直接把網頁用的php.ini直接拷貝覆蓋到命令列cli用的php.ini,但這樣可能會導致一些擴充套件庫路徑不正確而報錯)


2第2個坑:相對路徑
cli模式執行php檔案就像這樣:php /home/wwwroot/test.php
需要用檔案的絕對路徑,你的php檔案中的include、require之流也要用絕對了。類似include("../xxx.php") 肯定要完蛋,因為這時的 .. 上級目錄指的是當前命令列所在目錄的上級,而且也沒有網站根目錄的概念了。不過我發現不帶點的同級相對路徑 include("xxx.php") 還是好使的。

3、第3個坑:後臺執行
在命令列直接php 執行指令碼,如果執行的是長時間任務,那麼切出游標指令碼就停止了。既然我們用cli模式就是要幹長時間的活,所以一定要用後臺執行格式:nohup php /home/wwwroot/test.php & ,執行後螢幕會顯示程序pid,這時要按Enter切出游標,按別的程序就停了。
檢視所有後臺執行的cli 程序: ps aux | grep '[ ]php' ,網上很多文章都只寫ps,在我的機器上用ps只能看到剛剛執行的程序,過一段時間後就看不到了。停止程序就kill 相應的pid,如果指令碼有輸出的話,nohup執行的所有輸出都在nohup.out 檔案中,可以用tail或vi檢視它 tail -f nohup.out

然後就沒什麼大坑了,一些變數比如 $_SERVER['HTTP_HOST'] 肯定沒了,$_SERVER['PHP_SELF'] 也變成了檔案絕對路徑。用了幾天發現cli模式確實爽,夠穩定,佔用資源也少,回頭把爬蟲全搞成cli模式!