在后台运行php脚本而不卷曲

时间:2010-07-19 14:03:37

标签: php curl

我在后台运行php脚本时遇到了一些麻烦。

我的管理区域有访问HTTP身份验证和邮件输出脚本,我想在后台运行。这个脚本需要很长时间才能执行,所以我希望它在后台执行。

我的想法是,当我访问“发送”页面时,它会在后台执行发送脚本,并将用户重定向到其他位置。

但是目前正在尝试使用cURL我无法进入发送脚本,因为它返回了所需的授权。

感谢任何建议,谢谢。

7 个答案:

答案 0 :(得分:4)

  1. 创建一些作业队列(数据库/文件/直接写入某个套接字)。
  2. 创建消耗这些作业的deamon(套接字)或cron作业。
  3. 如果您希望稍后提供“成功”(或失败)消息,请让工作人员在需要时在某个商店中报告任务(数据库/文件/等)。

答案 1 :(得分:1)

如果您在Linux上运行它,可以尝试pcntl_fork()。请注意,这种方法需要PHP安装部分的一些魔力(默认情况下cccl被禁用为cgi),甚至更加神奇,使您的脚本能够在apache进程清理中生效。请参阅PHP上的comment以帮助您入门。

因此,分离流程将如下所示:

if ($pid = pcntl_fork())
    die();     // Parent

function shutdown() {
    posix_kill(posix_getpid(), SIGHUP);
}

ob_end_clean(); // Discard the output buffer and close

fclose(STDIN);  // Close all of the standard
fclose(STDOUT); // file descriptors as we
fclose(STDERR); // are running as a daemon.

register_shutdown_function('shutdown');

if (posix_setsid() < 0)
    die();      // <- This is an error

if ($pid = pcntl_fork())
    die();     // Parent

// Do your stuff here

答案 2 :(得分:1)

cURL有HTTP身份验证选项......

但要保存HTTP请求......这是我用来异步执行本地PHP的函数...

/** 
 * Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.  
 * Relies on the PHP_PATH config constant.
 *
 * @param string $filename  file to execute
 * @param string $options   (optional) arguments to pass to file via the command line
 */ 
function asyncInclude($filename, $options = '') {
    exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}

(其中PHP_PATH是一个定义为define('PHP_PATH', '/opt/bin/php5')或类似的)

它通过命令行传递参数。要在PHP中阅读它们,请参阅argv

答案 3 :(得分:0)

您是否尝试过将auth发送给cURL?

可以像http://user:pass@www.domain.com

一样简单

或类似的东西:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

修改

FWIW听起来像cURL可能是错误的工具,但由于auth问题不应该打折

答案 4 :(得分:0)

我从您的问题中了解到,您有一个运行另一个PHP脚本的PHP脚本。您不需要使用CURL来代替run your PHP script asynchronously

答案 5 :(得分:0)

版本1:

system('php your_script &'); - &amp;将在后台发送执行。

第2版:

不要求对脚本进行身份验证,您可以使用cURL。

答案 6 :(得分:0)

一些 - 其他 - 需要考虑的事情......我们按照你所描述的方式进行大量邮寄,至少每周10k,每天20k的爆发。我们在Cron上运行(经常通过系统启动,这对于我们的应用程序来说是光滑的)如果你没有在你的脚本上放置某种限制,它最终会超时,你的邮件工作将无法重启,中途的某个地方。我们超时并在一定数量后重新启动,通过将进度写入数据库来跟踪。由于邮件的频率和未知的操作长度,我们还使用锁文件来防止并发邮件发送。

如果您的电子邮件将接近15K /批量,我建议您查看托管的SMTP解决方案:http://smtp.comhttp://www.socketlabs.com/通过您的服务器排队并通过SMTP中继发送以确保可靠的传送。

无论您发送多少封电子邮件,都不要忘记遵守CAN-Spam!