Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在执行长时间运行的php脚本时,如何解决执行超时错误?_Php_Curl - Fatal编程技术网

在执行长时间运行的php脚本时,如何解决执行超时错误?

在执行长时间运行的php脚本时,如何解决执行超时错误?,php,curl,Php,Curl,我的数据库中有20000个电子邮件地址,并且不断增加。我一次发送100封电子邮件,然后使用CURL-php访问同一个页面,但该页面的执行时间仍然最长。我正在共享()服务器上运行这个php脚本。我应该做些什么来消除这个问题 我通过以下方式执行此脚本: exec("php-cli file.php > testoutput.php 2>&1 & echo $!", $output) 您可以在数据库中添加列(或辅助表),并将所有地址标记为初始“待处理” 然后,您的脚本可以

我的数据库中有20000个电子邮件地址,并且不断增加。我一次发送100封电子邮件,然后使用CURL-php访问同一个页面,但该页面的执行时间仍然最长。我正在共享()服务器上运行这个php脚本。我应该做些什么来消除这个问题

我通过以下方式执行此脚本:

exec("php-cli file.php > testoutput.php 2>&1 & echo $!", $output)
您可以在数据库中添加列(或辅助表),并将所有地址标记为初始“待处理”

然后,您的脚本可以:

- SELECT the number of worked addresses and total addresses
- display a progress bar
- SELECT the lowest 100, or 50, or N addresses yet to be worked
- send the emails and mark them worked
- issue a javascript to refresh itself.
然后,客户端将看到一个页面,其中进度条不断前进,并且从不超时(只要“N”足够小)

您也可以在AJAX中实现这一点,但这可能有点过头了

此外,您可以使用一些技巧(如果您还没有这样做的话)来加速操作。一种可能性是,如果电子邮件正文相同,则将多个地址“合并”为密件抄送:;这样,您可以在一次通话中发送多条信息。注意不要超过ISP可能实施的Bcc:限制。这个策略在ISP端使用了更多的资源,所以请与他们联系

另一种可能性(可以一起使用)是发送按域排序的电子邮件。如果可能,多个邮件服务器尝试在一个连接中向同一服务器发送电子邮件,以节省资源和时间。如果您将一组电子邮件全部发送到同一个域,则会使服务器更轻松

在最后一种情况下,您可以选择如下电子邮件:

SELECT * FROM addresses
    WHERE (worked=0 AND active = 1)
    ORDER BY SUBSTRING_INDEX(email, '@', -1)
    LIMIT 20;
然后(使用mysql函数的示例-PDO更好)

如果您将开始时间保存在PHP会话中,您甚至可以显示一个带有仪表板的漂亮工具栏,如

+--------------------+
|########            | 
+--------------------+
40% processed
38% delivered
 2% failed
Expected time remaining 5 min 17"
您可以在数据库中添加列(或辅助表),并将所有地址标记为初始“待处理”

然后,您的脚本可以:

- SELECT the number of worked addresses and total addresses
- display a progress bar
- SELECT the lowest 100, or 50, or N addresses yet to be worked
- send the emails and mark them worked
- issue a javascript to refresh itself.
然后,客户端将看到一个页面,其中进度条不断前进,并且从不超时(只要“N”足够小)

您也可以在AJAX中实现这一点,但这可能有点过头了

此外,您可以使用一些技巧(如果您还没有这样做的话)来加速操作。一种可能性是,如果电子邮件正文相同,则将多个地址“合并”为密件抄送:;这样,您可以在一次通话中发送多条信息。注意不要超过ISP可能实施的Bcc:限制。这个策略在ISP端使用了更多的资源,所以请与他们联系

另一种可能性(可以一起使用)是发送按域排序的电子邮件。如果可能,多个邮件服务器尝试在一个连接中向同一服务器发送电子邮件,以节省资源和时间。如果您将一组电子邮件全部发送到同一个域,则会使服务器更轻松

在最后一种情况下,您可以选择如下电子邮件:

SELECT * FROM addresses
    WHERE (worked=0 AND active = 1)
    ORDER BY SUBSTRING_INDEX(email, '@', -1)
    LIMIT 20;
然后(使用mysql函数的示例-PDO更好)

如果您将开始时间保存在PHP会话中,您甚至可以显示一个带有仪表板的漂亮工具栏,如

+--------------------+
|########            | 
+--------------------+
40% processed
38% delivered
 2% failed
Expected time remaining 5 min 17"

PHP的时间限制可以通过PHP的函数删除:

set_time_limit(0);

然而,这只会解决由于PHP本身注意到进程花费的时间太长而导致长时间运行的进程消亡的问题。虽然这是一个重要的步骤,但您还应该预测长时间运行的流程中的其他类型的故障,方法是将工作分成更小的批,并确保代码的结构允许流程在不重新运行整个过程的情况下恢复。

PHP的时间限制可以通过PHP的函数删除:

set_time_limit(0);

然而,这只会解决由于PHP本身注意到进程花费的时间太长而导致长时间运行的进程消亡的问题。虽然这是一个重要的步骤,但您还应该预测长时间运行的流程中的其他类型的故障,方法是将工作划分为较小的批,并确保代码的结构允许在不重新运行整个过程的情况下恢复流程。

按crontab计划的较小批进行工作,也许可以存储您获得的ID,以便crontab作业可以快速继续并执行下一个块在crontab安排的较小块中执行工作,也许可以存储您获得的ID,以便crontab作业可以快速继续并执行下一步。目前,我已经创建了一个反向进程,并使用php调用它。我还创建了一个日志。让它成为一个后端流程客户端不需要再等待了,我构建了一个仪表板,向他展示如何发送邮件以及如何发送剩余的邮件,我开始知道所有邮件是否都已发送感谢这个回答目前我已经创建了一个后端流程,并使用php调用了它。我还创建了一个日志。让它成为一个后端流程客户端不需要再等待了,我构建了一个仪表板,向他展示如何发送邮件以及如何发送剩余的邮件,我知道所有邮件是否都已发送感谢您的回答