0

我以前问过一个问题,并得到了答案,但我想我遇到了另一个问题。

我正在使用的 php 脚本执行此操作:

1 - 将文件从我的备份服务器传输到我的服务器

2 - 完成传输后,它会使用 curl 向其发送一些发布数据,从而创建一个 zip 文件

3 - 完成后,会回显结果,具体取决于结果;传输文件,或者什么都不做。

我的问题是:当文件足够小(小于 500MB)时,它会创建它,然后传回没有问题。当它更大时,它会超时,完成在远程服务器上创建 zip,但是因为它超时它不会被传输。

我从备份服务器上的命令行运行它。我在 php 脚本中有这个:

set_time_limit(0);                   // ignore php timeout
ignore_user_abort(true);             // keep on going even if user pulls the plug*
while(ob_get_level())ob_end_clean(); // remove output buffers

但是当我跑步时它仍然超时sudo php backup.php

是否使用 curl 使其超时,就像制作 zip 的另一端的浏览器一样?我认为问题在于响应没有被回显。

编辑:(@symcbean) 我什么也没看到,这就是我在挣扎的原因。当我从浏览器运行它时,我在地址栏中看到加载内容。大约 30 秒后,它就停止了。当我从命令行执行此操作时,同样的处理。30秒,它就停止了。这只发生在需要创建大拉链时。

它是通过文件调用的。该文件加载一个类,将连接信息发送到该类。它与服务器联系以制作 zip,将 zip 传回,对其执行一些操作,然后将其传输到 S3 进行归档。

它登录到远程服务器,使用 curl 上传文件。在得到有效响应后,它会再次将文件的位置作为 url 卷曲(我总是知道它是什么),这会启动我刚刚传输过来的 php 文件。zip 总是被创建没有问题,即使高达 22GB,当然有时需要很长时间。之后,它等待“创建”的响应。等待那个响应是它死亡的地方。

所以拉链总是被创建,但等待时间是“我认为”让它消亡的原因。

第二次编辑: 我从命令行尝试了这个:

$ftp_connect= ftp_connect('domain.com');
$ftp_login = ftp_login($ftp_connect,'user','pass'); 
ftp_pasv($ftp_connect, true);

$upload = ftp_put($ftp_connect, 'filelist.php', 'filelist.php', FTP_ASCII);

$get_remote = 'filelist.php';
$post_data = array (  
    'last_bu' => '0'
);      

$ch = curl_init();  
curl_setopt($ch, CURLOPT_URL, 'domain.com/'.$get_remote);    
curl_setopt($ch, CURLOPT_HEADER, 0 );   
// adding the post variables to the request   
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);   
//echo the following to get response 
$response = curl_exec($ch);     
curl_close($ch);    
echo $response; 

得到了这个:

<HTML>
<HEAD>
<TITLE>500 Internal Server Error</TITLE>
</HEAD><BODY>
<H1>Internal Server Error</H1>
The server encountered an internal error or
misconfiguration and was unable to complete
your request.<P>
Please contact the server administrator to inform of the time the error occurred
and of anything you might have done that may have
caused the error.<P>
More information about this error may be available
in the server error log.<P>
<HR>
<ADDRESS>
Web Server at domain.com
</ADDRESS>
</BODY>
</HTML>

同样,错误日志是空白的,仍会创建 zip,但由于创建超时约 650MB,我无法得到响应。

4

2 回答 2

0

问题在于生成要返回的文件的服务器代码。

检查php错误日志

由于某些原因,它可能会超时,但日志应该会告诉您原因。

于 2013-08-16T22:01:31.967 回答
0

我修好了,非常感谢所有帮助过我的人,它为我指明了正确的方向。

最后,问题出在远程服务器上。发生的事情是它正在超时 cURL 连接,它没有发送我需要的结果。

我所做的修复它是向我的类添加一个函数,该函数(再次)使用 curl 检查我知道它正在创建的 zip 文件 http 代码当它完成时,然后在本地抛出结果。如果还没有完成,请睡眠几秒钟,然后再次检查。

private function watchDog(){

$curl = curl_init($this->host.'/'.$this->grab_file);

//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);

//do request
$result = curl_exec($curl);

//if request did not fail
if ($result !== false) {
    //if request was ok, check response code
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

    if ($statusCode == 404) {
          sleep(7);
          self::watchDog();
    }
    else{
        return 'zip created'; 
    }
}

curl_close($curl);

}
于 2013-08-17T08:07:15.827 回答