【问题标题】:PHP - header() to self, does this start a new process?PHP - header() to self,这会启动一个新进程吗?
【发布时间】: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 触发时,如果当前数字不是太高,它会创建一个新进程。

标签: php cron header


【解决方案1】:

我不认为 header 做你认为它做的事情,它只是设置一个 HTTP 响应头。在“位置:”的情况下,它的 302 重定向到另一个 URL。浏览器将跟随链接,如果浏览器点击另一个页面,它可能会启动一个新进程。但这在 cron 中不起作用,因为根本没有收到 http 响应标头。

【讨论】:

  • 还要注意,标头重定向仅在初始 php 脚本执行完成后才会发生,因此它不会同时产生 100 个请求。它会做一个,然后将标题吐出到浏览器以再次点击 php 来做下一个。是的,在 crons 中没有用。
  • @Randall 一次一个很好,实际上是首选,这样我可以更轻松地跟踪它们。最终,在 CRON 和正在运行的进程都触发新进程之间,同时进程的数量(我监控并限制在一个上限)将很快饱和。
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 2011-08-01
  • 2012-10-27
  • 2022-01-20
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多