linux下PHP 批量抓取,进程超时
一次执行 100个PHP进程,为什么只有一部份在运行,还有一些一直没有动,我用strace -p PID 看到的都是类似这样的:
[user@server ~]$ sudo strace -p 29559 Process 29559 attached - interrupt to quit poll([{fd=7, events=POLLIN}], 1, 1000) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 0) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 1000) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 0) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 1000) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 0) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 1000) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 0) = 0 (Timeout) poll([{fd=7, events=POLLIN}], 1, 1000) = 0 (Timeout)
linux命令行下执行的PHP是这样的:
php test.php 0,100 php test.php 100,100 php test.php 200,100 php test.php 300,100 php test.php 400,100 php test.php 500,100 php test.php 600,100 ....
这样的批量运行了有尽100个,test.php 里是用curl抓取网页的;
php-fpm 我设置了超时时间为0 :
slowlog = log/$pool.log.slow request_slowlog_timeout = 3s request_terminate_timeout = 0log.slow中没有日志记录
php文中里CURL函数部分:
$ch = curl_init(); $user_agent1='Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0'; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 0); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); $content =curl_exec($ch); curl_close($ch);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
http://www.jianshu.com/p/8a247cae629a
参考下这个
逻辑太简单了,得改
正确
好的,我试试看,谢谢
好厉害。学习。
curl阻塞了,进程就死掉了,你可以参考
http://www.oschina.net/question/54100_58279重写你的抓取逻辑,python,node-js所谓的适合采集也无非就是使用了异步非阻塞模式,php也可以使用异步非阻塞模式,效率同样很高,我曾经用过python的开源爬虫scrapy,并在上面做了大量的二次开发,scrapy使用的twisted异步网络库实现异步,在vps上测试1小时可以抓取3w个网页,我用php使用异步来做,效率完全不差
用其他语言吧
技术能力有线,c不懂!
最好的是c/c++,用线程并发
脚本语言都不适应
兄弟改用python或node.js吧,php并不适合做这样的工作。。