如何强制浏览器等待 php 服务器发送响应?
How to force browser to wait until php server sends a response?
我有以下设置:
- 客户端:浏览器
- 服务器 A:托管我的 PHP 应用程序的服务器
- 服务器B:存储服务器
所以,服务器B有很多数据供用户在需要时下载。客户端向服务器A发送请求请求该文件,服务器A通过SSH连接到服务器B并执行多项任务(包括解密和压缩),这些任务完成后在服务器B上生成一个zip文件,然后服务器A重定向使用 header("Location: https://serverb.com/index.php?file=thefileiwant.zip")
.
发出的请求
问题是如果有很多文件(我正在测试 50 个),则下载的 zip 文件为 0 字节。对于少量文件,一切正常所以我认为问题是解密和压缩花费的时间太长,服务器只是发送和清空文件,因为请求超时...
我该如何解决这个问题?
编辑以添加更多信息:
- 生成的文件只有 4mb,所以我认为这不是问题所在。
已经在 php_ini 上增加了 max_execution_time(虽然它似乎没有用,因为我在 2 分钟之前得到了 0 字节的 zip..
已经将这些添加到文件中
ob_implicit_flush();
ini_set('max_execution_time','120');
header('Expires: 0');
set_time_limit(0);
如@IdontDownVote 所述,问题不在于浏览器没有等待,而是 ssh 连接的问题:
这是我压缩文件的方式:
ssh2_exec($connection, 'zip -j '.$path.$zipname.'.zip '.$path.'*.txt '.$path.'*.3gp');
问题是这只是将命令发送到服务器 B 并跳转到下一行,因此 zip 文件从未完成。我意识到,当我看到几个文件的名称模式类似于 zid5Jhn
而不是实际的 zip 文件(这与@IdontDownVote 评论一起)
我使用我用来获取命令输出的函数解决了这个问题:
function get_command_return($connection, $command){
$stream = ssh2_exec($connection, $command);
stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
return stream_get_contents($stream_out);
}
所以我通过更改 ssh2_exec(...) to get_command_return(...)
解决了它,尽管我认为只有行 stream_set_blocking($stream, true);
是必要的
谢谢
我有以下设置:
- 客户端:浏览器
- 服务器 A:托管我的 PHP 应用程序的服务器
- 服务器B:存储服务器
所以,服务器B有很多数据供用户在需要时下载。客户端向服务器A发送请求请求该文件,服务器A通过SSH连接到服务器B并执行多项任务(包括解密和压缩),这些任务完成后在服务器B上生成一个zip文件,然后服务器A重定向使用 header("Location: https://serverb.com/index.php?file=thefileiwant.zip")
.
问题是如果有很多文件(我正在测试 50 个),则下载的 zip 文件为 0 字节。对于少量文件,一切正常所以我认为问题是解密和压缩花费的时间太长,服务器只是发送和清空文件,因为请求超时...
我该如何解决这个问题?
编辑以添加更多信息:
- 生成的文件只有 4mb,所以我认为这不是问题所在。
已经在 php_ini 上增加了 max_execution_time(虽然它似乎没有用,因为我在 2 分钟之前得到了 0 字节的 zip..
已经将这些添加到文件中
ob_implicit_flush();
ini_set('max_execution_time','120');
header('Expires: 0');
set_time_limit(0);
如@IdontDownVote 所述,问题不在于浏览器没有等待,而是 ssh 连接的问题:
这是我压缩文件的方式:
ssh2_exec($connection, 'zip -j '.$path.$zipname.'.zip '.$path.'*.txt '.$path.'*.3gp');
问题是这只是将命令发送到服务器 B 并跳转到下一行,因此 zip 文件从未完成。我意识到,当我看到几个文件的名称模式类似于 zid5Jhn
而不是实际的 zip 文件(这与@IdontDownVote 评论一起)
我使用我用来获取命令输出的函数解决了这个问题:
function get_command_return($connection, $command){
$stream = ssh2_exec($connection, $command);
stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
return stream_get_contents($stream_out);
}
所以我通过更改 ssh2_exec(...) to get_command_return(...)
解决了它,尽管我认为只有行 stream_set_blocking($stream, true);
是必要的
谢谢