2013-08-28 2 views
0

У меня есть странная проблема с запросом, который не выполняется при определенных обстоятельствах. Я уверен, что это не проблема с самим запросом, так как я вставил очень простой запрос прямо перед ним, что не может быть ошибкой, но не выполняется.PHP не выполняет запрос после длительной обработки

Вот краткое объяснение того, что делает этот скрипт: Скрипт выполняется cronjob каждую минуту. Он проверяет список загруженных PDF-файлов и разбивает их на отдельные файлы, если они еще не были разделены, а затем генерируется JPG-превью.

Он работает отлично для средних PDF-файлов. Однако загрузка большого PDF-файла (например, 30 МБ, 28 страниц) заставит скрипт остановиться в какой-то момент без каких-либо причин (см. Встроенные комментарии). У меня есть error_logged процесс разделения PDF ($ pdf->), и он отлично работает.

Друг подозревал, что эта странная ошибка может быть вызвана недостаточным пространством памяти на сервере или достигнутым максимальным количеством подключений к базе данных, но мы оба не очень разбираемся в таких вещах. Может быть, один из вас?

ignore_user_abort(0); 
set_time_limit(0); 
error_reporting(-1); 

if($_SERVER['SERVER_ADDR'] == '127.0.0.1') 
    include_once("../config.php"); 
else 
    include_once("/home/httpd/docs/myproject/inc/config.php"); 

include_once(ROOT."inc/db.class.php"); 
include_once(ROOT."inc/functions.php"); 
include_once(ROOT."inc/generate_previews.class.php"); 

$db = DB::getInstance(); 
$select_file_name_query = "SELECT * FROM z_tmp_preview_files WHERE id > '0' AND status = '0' AND file_name != ''"; 
$result = $db->query($select_file_name_query); 


while($job_preview = $db->fetchNextObject($result)){ 

    $job_id = $job_preview->rel_job_id; 
    $file = $job_preview->file_name; 

    $set_inprocess_file_name_query = "UPDATE z_tmp_preview_files SET status = '1' WHERE id = '".$job_preview->id."'"; 
    $set_inprocess_file_name_result = $db->execute($set_inprocess_file_name_query); 

    $file_info = explode('.',$file); 
    $file_name = $file_info[0]; 
    $jpg_file = str_replace(".pdf", ".jpg", $file); 

    // ======================================================================================= 
    // PDF-file is split into separate pages and JPG-previews are generated with the McPdf Class 
    // This works just fine, even with very large files, but may take some minutes. 
    // ======================================================================================= 
    $pdf = new McPdf($job_id); 
    $pdf->process(); 

    $files_burst = LoadFiles("".ROOT."intern/jobs/".$job_id."/burst/"); 
    $page_count = sizeof($files_burst); 

    error_log("\nTEST:",3,ERROR_DIR); 
    $sql = "SELECT annotation_type FROM annotations"; 
    $value = $db->queryUniqueValue($sql); 

    // ======================================================================================= 
    // This is where the PHP-script just stops. Non of the following error_logs are shown, 
    // nor will the UPDATE-query be executed. The previous SELECT-query probably hasn't been executed as well. 
    // ======================================================================================= 
    error_log($value,3,ERROR_DIR); 

    $remove_file_name_query = "UPDATE z_tmp_preview_files SET status = '2' WHERE id = '".$job_preview->id."'"; 
    error_log("\n\ncheck query:",3,ERROR_DIR); 
    error_log(" ".$remove_file_name_query,3,ERROR_DIR); 
    $remove_file_name = $db->execute($remove_file_name_query); 

    error_log("\npossible error:".$remove_file_name."\n",3,ERROR_DIR); 
} 

db.class работает просто отлично, я использую его везде в моем проекте, но если вам интересно, что делает queryUniqueValue, вот код:

function queryUniqueValue($query, $debug = -1){ 
    $query = "$query LIMIT 1"; 

    $this->nbQueries++; 
    $result = mysql_query($query) or $this->debugAndDie($query); 
    $line = mysql_fetch_row($result); 

    $this->debug($debug, $query, $result); 

    return $line[0]; 
} 

Edit: Вот еще догадка: Может быть, это какой-то тайм-аут mysql? Проблема возникает только тогда, когда класс McPdf занимает очень много времени для обработки. Насколько я могу судить, после выполнения $ pdf-process() первый mysql-запрос прервет выполнение PHP-скрипта.

ответ

0

Возможно, вы поражаете PHP «максимальное время выполнения скрипта»? По-моему, по умолчанию установлено 30 секунд. Попробуйте увеличить максимальное время выполнения в начале вашего скрипта:

ini_set('max_execution_time',2*60); // will set it to 2 minutes 

HTH

+0

Я попробовал и установить его на 1 час, но, к сожалению, это не сработало:/ –

+0

Хм, может быть база данных время ожидания. Через сколько минут происходит тайм-аут? И это всегда одно и то же? Ознакомьтесь с http://gauravasthana.blogspot.nl/2011/02/exploring-timeout-variables-in-mysql.html В нем перечислены несколько параметров тайм-аута в MySQL, они могут вернуть вас в нужное русло. – HammerNL

Смежные вопросы