The Question Of Php System Commend Run Wget
好吧,我承认我是标题党。不过让我郁闷一上午的就是这个问题。使用PHP的system函数去调用Linux的Wget。
任务的需求是:将远程FTP文件抓取到本地,分析文件内容,存到数据库中。很简单的一个功能,我计划的步骤如下:
- 使用crontab调用PHP,将参数传给它
- PHP删除库中相关内容
- 去判断文件是否已经存在,如果存在PASS直接存库,否则执行system函数抓取文件
- 存库,记日志
步骤是很清晰的,不过问题很让人头疼。五月份跑的好好的程序,放在六月份不能执行了。FTP服务端没有改过配置,我的程序也没有动过。活见鬼。而且手动执行crontab的内容没有问题,放在crontab里就不行。
调试过程
人总是喜欢钻牛角尖,聪明如我也不可免俗。我的调试过程如下:
- 在开发环境配置crontab
- 将php里执行的主语句即system调用wget方法处跟踪
- 将system运行返回的结果输出到日志中以便查看
在日志中发现,使用system调用wget去抓数据时,返回的命令运行结果为:127 对运行结果感兴趣的同学,可以去看这里:Linux命令的返回值
于是我就陷入了牛角尖中。难道是system执行wget需要用特殊的方法?或者是有什么特别的门道?开始翻手册,并如获至宝的找到了如下语句:
Note: 如果用本函数启动一个程序并希望保持在后台运行,必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。
难道是PHP程序挂起?我没有将wget的输出内容重定向?
于是,又是对wget加-O参数,又是直接重定向输出结果,却一点用处没有。于是我去翻Google,找了一上午,无果。并且看别人代码片段中也是直接用system执行的wget。看来我这现象属于人品问题了。
走出牛角尖了吗?
试了N种方法,均不能解决问题。于是开始黯然神伤,艾天怨地,对自己的遭遇不平衡起来。凭啥就我遇到这各种个样的天杀的,狗日的,MB的问题?
可是,再恨也没有用,程序总得要写。毕竟已经好多天都有问题了。本来发现的就晚了,可是发现后却不解决就更不对了。
我首先的想法是,换种实现方式。既然抓取数据有问题,那么我试一下别的方法?具体实践过程如下:
- 试用file_get_contents 发现其无法处理FTP文件(含用户名及密码)
- 发现了ftp_connect函数,但是PHP没有装扩展,需要重新编译PHP,成本太大
上面的方法同样行不通,于是已经开始愤怒。正打算破罐破摔的时候,忽然灵光一现,大呼上当。感觉自己实在是愚蠢之极。原来自己仍然把问题局限在了牛角尖里。
走到南墙心不悔
因为既然php的system执行wget咱不会用,那么为啥非得用PHP去调用WGET呢?完全可以使用SHELL啊。
本来就是shell脚本调用php去执行,完全可以将FTP文件下载的过程交给shell去搞定啊。同样文件是否存在的判断也可以用shell。自己真的走到了南墙了。
不过到了南墙也不后悔,虽然过程十分曲折,不过总算也涨了点小经验,下次遇到问题的时候想一下,自己是不是已经钻进了牛角中。且当自己以为换条路可以走出牛角的时候是不是走进了另一个牛角里!
经实验,上面的方案完全可行。问题解决!

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2010/06/22/1777/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
嗯,受教了。
[回复]
@vzomik
只是记录我今天辛苦的奋斗历程。呵呵。
不过看你对shell很精通啊。话说我都好久没写shell了。现在找什么都得用Google… :???:
[回复]
晕,果然是标题党,到最后用SHELL了
[回复]
simaopig 回复:
六月 25th, 2010 at 9:35 上午
呵呵,其实我主要就是想记录我这个钻牛角尖的过程。。
[回复]
顶一下!~
[回复]
楼主你这个菜鸟,我抚摸一下你的头。。。乖乖
[回复]
@风吟
没理解兄弟的意思。是想表达什么吗? :cool:
[回复]
受教
[回复]