在命令行上定时

时间:2013-08-16 20:46:47

标签: php

我之前曾问过一个问题and got the answer,但我认为我遇到了另一个问题。

我正在使用的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上传文件。在一个有效的响应,它再次卷曲文件的位置作为一个网址(我将永远知道它是什么),它启动我刚刚转移的php文件。拉链始终没有问题,甚至高达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左右超时,我无法得到响应。

2 个答案:

答案 0 :(得分:0)

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

检查php错误日志

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

答案 1 :(得分: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);

}