Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 直接从服务器中断HTTP请求_Php_Http Headers - Fatal编程技术网

Php 直接从服务器中断HTTP请求

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

我有两个文件client.php和server.php。 客户端文件向服务器文件发送HTTP请求。服务器文件处理请求的速度可能非常慢,因此我只希望它回答客户端“好,请求正确,结果将通过电子邮件发送”

但是我不知道如何让服务器用合适的头关闭HTTP请求并继续它的工作。如果我指定了1秒的超时,我将无法知道服务器是否会接受该请求

那么在PHP中有可能吗?你知道怎么做吗

client.php:

<?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运行。