Linux-crontab 执行PHP 脚本超时
需求:crontab 每天凌晨12 点统计 100 组服务器的数据到本地数据库;
注: 每组服务器的从查询很慢
伪php代码
for(;;){
//查询每组服务器
//入库
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
需求:crontab 每天凌晨12 点统计 100 组服务器的数据到本地数据库;
注: 每组服务器的从查询很慢
伪php代码
for(;;){
//查询每组服务器
//入库
}
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
可以使用PHP 的 popen(command,mode) 函数,实现异步;
for(;;){
popen('ecex.php','r')
}
在 ecex.php 里实现一组服务器的查询和入库
既然瓶颈在从服务器, 何不用并发的方式来同时处理100个从服务器
这种情况下就建议使用异步处理(或者说是并行处理)了,虽然PHP本身的确没有提供好的异步方法,但是可以通过fopensock()等方式进行异步调用,这样等待全部的脚本执行完成返回结果后退出即可,我在徳问上看到过类似的问题,地址如下:https://www.wenjiangs.com/group/topic-13319.html
我也看了其他的回答,个人感觉如果每台机器上都部署crontab并向“本地”汇报的话,应该是比较麻烦,而且效果不理想,不如本地进行100个线程对远程进行查询操作。
这样的话可以只在一台机器上发出请求,等待自己的100个异步线程(不知道线程在这里用的合不合适)完成后即可。
我认为这样比较合适:
第一步,你每台服务器每天把数据以log的方式输出到服务器某一目录下,这个是实时输出,即有数据就马上输出到目标目录。
第二步,写一个同步程序,实时的把每台服务器上的最新数据同步到一个公共服务器上,这里最好把这个同步程序封装成类似同步客户端或工具的东东,每装一台服务器就安装同步工具。
第三步,就是你说的每天凌晨12点本地服务器(或其他要获取的服务器,这里很灵活)向公共服务器获取所有数据,然后分析入库
php脚本就统计一个服务器上的数据,然后用shell脚本分别运行这个php脚本
在100组服务器上放置统计数据的php代码 生成数据文件
在主服务器上crontab 分别去调用100组服务器上的php文件 再把生成的数据文件传回主服务器
再在主服务器上 进行汇总
这样应该会快很多
超时的话,可以设置执行时间
void set_time_limit (int seconds)
参数设置为0即可
你也可以看看这个帖:http://www.codingcool.com/2012/10/10/关于php实现守护进程的代码/
如果现在碰到的问题是PHP超时问题,那么我认为是不是可以从入口方式上考虑调整一下。
目前是100台服务器,如果将来更多怎么办?
因此,我建议的设计原则:
1. 定期任务这里的PHP只是起到启动任务的工作。具体只实现如下功能:
a. 定时启动任务
b. 分发任务到实际业务处理程序或新fork进程出来进行独立处理
c. 将调度情况记录到日志中。
d. 由于可能每个任务都可能处理超时,因此,不建议在这个脚本中再去监控处理结果。
2. 在调用分派任务上,可以考虑使用curl_multi_init 的形式,进行并发处理。只要处理好瞬时high CPU的问题。应该一定程度上能够解决问题。