Php 直接从服务器中断HTTP请求
我有两个文件client.php和server.php。 客户端文件向服务器文件发送HTTP请求。服务器文件处理请求的速度可能非常慢,因此我只希望它回答客户端“好,请求正确,结果将通过电子邮件发送” 但是我不知道如何让服务器用合适的头关闭HTTP请求并继续它的工作。如果我指定了1秒的超时,我将无法知道服务器是否会接受该请求 那么在PHP中有可能吗?你知道怎么做吗 client.php:Php 直接从服务器中断HTTP请求,php,http-headers,Php,Http Headers,我有两个文件client.php和server.php。 客户端文件向服务器文件发送HTTP请求。服务器文件处理请求的速度可能非常慢,因此我只希望它回答客户端“好,请求正确,结果将通过电子邮件发送” 但是我不知道如何让服务器用合适的头关闭HTTP请求并继续它的工作。如果我指定了1秒的超时,我将无法知道服务器是否会接受该请求 那么在PHP中有可能吗?你知道怎么做吗 client.php: <?php $resource = curl_init(); curl_setopt($resourc
<?php
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, 'http://localhost/server.php');
curl_setopt($resource, CURLOPT_RETURNTRANSFER, true);
curl_setopt($resource, CURLOPT_TIMEOUT, 30);
curl_exec($resource);
我知道这并不完全是你所要求的(不确定这是否可行),但我会有一个由另一个线程处理的队列。请求进入服务器,它将详细信息添加到队列(可以在数据库中),并响应客户机。然后,您可以有一个cron,稍后运行并处理队列。我知道这并不是您所要求的(不确定这是否可行),但我会有一个由另一个线程处理的队列。请求进入服务器,它将详细信息添加到队列(可以在数据库中),并响应客户机。然后,您可以使用一个cron,稍后运行并处理队列。很抱歉,发送
连接:close
和flush()
不是解决方案-不能跨服务器或浏览器移植。这似乎是一个解决方案,因为当您运行一个简单的测试时,它似乎是有效的。如果你试着用它
send_result_to_client();
sleep(60); // simulate a job...
mail(...); // ...ENDING with a mail message
然后什么也不做,或者更糟糕的是,做任何用户都会做的事情——当他看到“你会收到电子邮件通知”时,立即关闭窗口——你会发现在大多数平台上,电子邮件永远不会被发送,工作也永远不会完成
curl
如果已接收到连接:关闭
和内容长度
字节,但从
但是服务器并没有关闭连接,实际上也没有。这需要在处理作业之前执行die()
或exit()
因此,您的脚本只会继续执行,直到浏览器实际关闭连接为止——此时(通常)处理中止。也许在某些平台上没有,但不要指望它
您可以尝试使用另一种破解方法来改善这种情况:
set_time_limit(VERY_LONG_TIME);
ignore_user_abort();
但事实上,这是一种黑客行为
没有真正可移植的解决方案。通常,正如Manatok所建议的,作业在其他地方排队,队列由另一个线程异步处理。这可能是最好的解决办法
其他可能性包括一种不同的、可能更简单的方法来完成同样的事情,使用atd和at命令(或Windows下的等效命令)对作业进行排队。您可以使用shell_exec
创建“作业控制”,方法是通过管道传输一个新的PHP脚本,由atd
执行:
shell_exec("echo 'php -q /path/to/script.php \"param1\" \"param2\" | at now");
(或者更有效地,使用popen
运行“at now
”,并将要执行的命令写入其stdin
)
例如,见:
您也可以尝试通过popen
或shell_exec
生成并发作业,但需要将其与服务器进程分离,否则系统将被作业可执行文件的副本占用(如果在Windows下执行此操作,则为CMD.EXE
)
见:
很抱歉,发送
连接:关闭和刷新()
不是解决方案-不能跨服务器或浏览器移植。这似乎是一个解决方案,因为当您运行一个简单的测试时,它似乎是有效的。如果你试着用它
send_result_to_client();
sleep(60); // simulate a job...
mail(...); // ...ENDING with a mail message
然后什么也不做,或者更糟糕的是,做任何用户都会做的事情——当他看到“你会收到电子邮件通知”时,立即关闭窗口——你会发现在大多数平台上,电子邮件永远不会被发送,工作也永远不会完成
curl
如果已接收到连接:关闭
和内容长度
字节,但从
但是服务器并没有关闭连接,实际上也没有。这需要在处理作业之前执行die()
或exit()
因此,您的脚本只会继续执行,直到浏览器实际关闭连接为止——此时(通常)处理中止。也许在某些平台上没有,但不要指望它
您可以尝试使用另一种破解方法来改善这种情况:
set_time_limit(VERY_LONG_TIME);
ignore_user_abort();
但事实上,这是一种黑客行为
没有真正可移植的解决方案。通常,正如Manatok所建议的,作业在其他地方排队,队列由另一个线程异步处理。这可能是最好的解决办法
其他可能性包括一种不同的、可能更简单的方法来完成同样的事情,使用atd和at命令(或Windows下的等效命令)对作业进行排队。您可以使用shell_exec
创建“作业控制”,方法是通过管道传输一个新的PHP脚本,由atd
执行:
shell_exec("echo 'php -q /path/to/script.php \"param1\" \"param2\" | at now");
(或者更有效地,使用popen
运行“at now
”,并将要执行的命令写入其stdin
)
例如,见:
您也可以尝试通过popen
或shell_exec
生成并发作业,但需要将其与服务器进程分离,否则系统将被作业可执行文件的副本占用(如果在Windows下执行此操作,则为CMD.EXE
)
见:
aah这很有道理,不错:)正如你所说,这是可能的。使用atd(或调度器,或任何类似的端口和包装器)来完成。或者另一个PHP脚本,从crontab.aaah运行,很有意义,很好:)这是可能的,正如您所说的。使用atd(或调度器,或任何类似的端口和包装器)来完成。或者另一个PHP脚本,从crontab运行。