Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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_Http_Yii_Download_Xml Generation - Fatal编程技术网

PHP长时间运行请求执行两次

PHP长时间运行请求执行两次,php,http,yii,download,xml-generation,Php,Http,Yii,Download,Xml Generation,我正在努力解决一个仅在长时间运行的请求中出现的问题。我有一个web应用程序,可以根据需要在XML文件中导出大量数据。根据数据的不同,导出运行时间从一秒到几分钟不等。我用很少的数据测试了导出,xml生成和文件下载工作正常。然后我用大量数据对它进行了测试,xml生成运行了大约30分钟(由于大量的数据库查询)。 但是这个长时间运行的请求的问题是,在生成xml文件之后,它不是下载,而是再次生成该文件。再次生成xml时,会收到站点加载错误。更多的数据和超过一小时的xml生成时间也会发生同样的情况。。。 那

我正在努力解决一个仅在长时间运行的请求中出现的问题。我有一个web应用程序,可以根据需要在XML文件中导出大量数据。根据数据的不同,导出运行时间从一秒到几分钟不等。我用很少的数据测试了导出,xml生成和文件下载工作正常。然后我用大量数据对它进行了测试,xml生成运行了大约30分钟(由于大量的数据库查询)。 但是这个长时间运行的请求的问题是,在生成xml文件之后,它不是下载,而是再次生成该文件。再次生成xml时,会收到站点加载错误。更多的数据和超过一小时的xml生成时间也会发生同样的情况。。。 那么为什么会发生这种情况呢?此问题仅适用于运行约30分钟或更长时间的此类请求。是否可能有超时再次启动请求?但是第二个文件生成是在完成第一个文件之后开始的,而不是在固定的时间之后

但是第二个文件生成是在完成第一个文件之后开始的,而不是在固定的时间之后

如果使用基于文件的会话,会话文件上的锁将一次只允许一个正在运行的PHP脚本访问该文件,这可能是阻塞的原因,以及为什么在当前脚本完成后会发生下一个请求

对于大型导出,一个选项是以某种方式在后端处理“脱机”并检查完成的文件。 例如:请求下载,立即获取“密钥”,并让php在后端生成导出。 然后,浏览器可以继续检查“key”的导出是否已完成,并在准备好后下载。允许用户启动导出,而不必担心浏览器中途关闭,或在不重新生成的情况下多次下载同一导出


或者,如果需要定期导出,只需从cron作业中对其进行预处理,以便最终用户可以在需要时快速下载新数据,而无需等待。

您是否正在使用会话?是的,我正在使用会话。问题可能是由会话引起的吗?不,会话很重要,原因是@Oddession已经指出。您是否检查过浏览器是否发出两次请求?它可能正在重试。它不应该这样做,可能是您使用的js库?但是,对于大文件,您肯定无法向用户返回响应,我建议您进行脱机处理。或者,不要让浏览器在服务器上ping,而是在生成报告后,获取电子邮件地址,并将报告或报告链接通过电子邮件发送给请求者。好的,这听起来似乎有道理,但实际上我并没有提出第二个要求。我触发的唯一请求是导出,当导出很小且仅持续几秒钟时,此请求会正确执行,但如果导出持续几分钟(~30分钟),则请求会执行两次。因此,根据执行时间的不同,行为并不总是相同的。似乎涉及到一些超时。。。