php cli模式



本来我的小爬虫在apache环境下set_time_limit(0) 就可以24小时不断爬,最近部署到nginx环境下就不灵了,各种504 timeout。所以干脆cli模式走起吧!

手册:http://php.net/manual/zh/features.commandline.php
我的环境:Ubuntu 10.04 + php 5.2

0、看下cli模式好使不
命令行下运行 php -r 'echo php_sapi_name()."\n";'
这条命令就是在cli模式运行php语句,php -r就是run一条php命令的意思,php_sapi_name()判断当前执行的php是什么模式下,执行成功在屏幕上输出 cli,不成功说明你的php cli模式有问题。

1、第1个坑:相对路径
cli模式执行php文件就像这样:php /home/wwwroot/test.php
需要用文件的绝对路径,你的php文件中的include、require之流也要用绝对了。类似include("../xxx.php") 肯定要完蛋,因为这时的 .. 上级目录指的是当前命令行所在目录的上级,而且也没有网站根目录的概念了。不过我发现不带点的同级相对路径 include("xxx.php") 还是好使的。
喜欢
回应 推荐 喜欢 只看楼主

    老袁
    老袁 (蹭) 2013-10-18 21:53:20

    2、第2个坑:Mysql连不上
    这个问题网上很多人说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和浏览器的一致了。
    赞 回应
    老袁
    老袁 (蹭) 2013-10-18 21:57:33

    然后就没什么大坑了,一些变量比如 $_SERVER['HTTP_HOST'] 肯定没了,$_SERVER['PHP_SELF'] 也变成了文件绝对路径。用了几天发现cli模式确实爽,够稳定,占用资源也少,回头把爬虫全搞成cli模式!
    赞 回应
    老袁
    老袁 (蹭) 2013-11-27 08:57:55

    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
    赞 回应
    老袁
    老袁 (蹭) 2014-03-07 09:12:01

    没人关心。。。
    赞 回应
    有天你能看到
    有天你能看到 (希望有一天和你再见,我爱你) 2014-04-15 20:26:48

    有阿
    赞 回应
    ImN1
    ImN1 2014-04-16 16:54:53

    有,不怎么爱打字,cli 偶用了很多年了,我最早的爬虫就是用php cli做parse的
    赞 回应
    ✪_✪
    ✪_✪ (举头三尺有神明) 2014-04-16 17:06:08

    php cli 也用了很久了,一直很稳定。我们是用 supervisor 来做进程管理的,非常好用。
    赞 回应
    老袁
    老袁 (蹭) 2014-04-16 17:21:37
    有,不怎么爱打字,cli 偶用了很多年了,我最早的爬虫就是用php cli做parse的 ImN1

    嗯,我也是写爬虫,我还用web界面管理cli进程
    赞 回应
    老袁
    老袁 (蹭) 2014-04-16 17:22:29
    php cli 也用了很久了,一直很稳定。我们是用 supervisor 来做进程管理的,非常好用。 ✪_✪

    我用web管理。。。用web来启动cli进程可能不大安全吧,反正是本地的爬虫机
    赞 回应
    ✪_✪
    ✪_✪ (举头三尺有神明) 2014-04-16 17:24:30
    我用web管理。。。用web来启动cli进程可能不大安全吧,反正是本地的爬虫机 老袁

    web 启动也做过,ignore_user_abort 采集QQ签名和微博,就是管理调试起来略麻烦。
    现在做的是恶意网址后台扫描。

有话要说