我有一个网站,它从远程ftp服务器(linux proftpd)加载配置文件(每1个网页5-15个)。
当用户只打开(刷新)一个网页时,一切正常,网页呈现速度很快(约100毫秒)。当用户在web浏览器上一个接一个地打开4-6个选项卡(打开选项卡之间的延迟约1秒)时,平均1-3个网页渲染速度很快,但4-6个页面的渲染速度太慢(最多60秒或更长)。
我发现了瓶颈:这是ftp_get()php函数,当从ftp获取文件时,它会冻结到ftp_connect()中设置的超时时间。仅ftp_get()冻结网页呈现。
public function getConfigViaFtp($config_name)
{
$handle = fopen('php://temp', 'r+');
ftp_fget($this->getFtpConnectionStream(), $handle, $config_name, FTP_ASCII);
rewind($handle);
return stream_get_contents($handle);
}
我使用ssh连接到远程ftp服务器,并在页面冻结时运行ftptop查看连接。proftpd只有一个与命令“RETR”的连接。
ftp_get始终成功地从ftp获取第一个(有时最多5个文件)文件,但另一个文件始终为空(但在ftp服务器上存在且不为空),并且ftp_获取此文件的超时。
我尝试:
ob_start();
$result = ftp_get($this->getFtpConnectionStream(), 'php://output', $config_name, FTP_ASCII);
$data = ob_get_contents();
ob_end_clean();
尝试ftp\u pasv()
但是什么也没有:(ftp_get()
和网页仍然冻结了很多时间,并且不会在每个网页的末尾加载文件内容。
怎么了?proftpd设置(默认)还是其他?
已解决:ftp_-pasv()在ftp_-login()之后,但不是在ftp_-connect之后,并且一切正常:)