【发布时间】:2017-10-21 09:07:42
【问题描述】:
设置
我有一个重新定位到自身的 PHP 脚本。比如……
if($val) {
header('Location: ' . ROOTPATH . $_SERVER['PHP_SELF']);
die();
}
问题
脚本逐行爬取表格,处理每一行需要至少 45 秒。该表可能是空的,也可能有数百行。脚本到达表格末尾后退出。
如果我只是简单地使用循环遍历表格,我几乎肯定会最终触发default_socket_timeout,因为处理每一行需要很长时间。相反,我选择自己创建一个新进程,同时终止当前进程。
问题
但这是否像我想的那样有效?使用header() 后跟die(),我是否在单独的线程上创建了一个新进程,并终止了当前(旧)进程?还是它们在彼此之间递归叠加,只会使我试图避免的问题更加复杂?
还有……(敬畏,废话)
我目前正在使用浏览器来测试所有内容,但此脚本最终将由 CRON-Job 启动。在键入此内容时,我感觉header() 不适用于通过 CRON 运行的进程和I was right。呸。骗子。
我仍然有兴趣了解header() 的原始问题 - 因为我将使用它进行测试 - 但现在我遇到了一个新问题,因为我需要以某种方式重新初始化同一脚本中的脚本脚本(在单独的线程/进程上,同时终止当前脚本)。一切都以对 CRON 友好的方式进行。
我尝试寻找解决这个新问题的方法,但没有任何结果。也许这个问题有一个我不熟悉的行话?
谢谢!
【问题讨论】:
-
我会担心您每行 45 秒的问题...您完全理解为什么要花这么长时间才能解决它吗?
-
@TimBrownlaw 是的。该脚本依赖于从几个外部源中提取数据(没有办法解决这个问题),以及解析和验证大部分返回的数据。像
file_get_html()和simplexml_load_string()这样的PHP 函数非常缓慢——并且完全依赖于提供数据的服务器。我希望有更好的方法。 -
我曾经为解决这类 cron 问题所做的事情是,我第一次执行 php 时会生成一个动态的动态 crontab 文件,并将其放入一个 'crons/minute-crons/'目录(如果存在,则将其 crontab 设置为每分钟简单地运行一次)。 “Minute-Cron”然后运行并删除自身,因此它永远不会再次运行,但如果它仍然需要继续一个漫长的过程,则会在最后创建一个新的。有点疯狂的自我复制的东西,你必须非常小心你如何设置它哈哈,它可以远离你!
-
如果您按 cron / php-cli 运行它,那么套接字超时将失去其相关性。 (但是,将其拆分/使用某种任务队列仍然是有意义的。)
-
@mario 因为(可能)有这么多行,我试图避免等待下一个 CRON 触发。我认为每分钟都是最低分辨率?我在进程初始化和终止时跟踪它们 - 所以我可以限制同时进程的数量。但是,为了不必等待新的 CRON 触发,我可以在当前进程完成后立即从内部触发一个新进程。并且当下一个 CRON 触发时,如果当前数字不是太高,它会创建一个新进程。