При переносе PHP-скрипта с PHP 5.2 на PHP 5.3 я наткнулся на следующую проблему: общая цель скрипта – интеллектуальный анализ данных. У меня есть процедура внутри, которая добавляет данные на сервер MySQL. Поскольку он действительно повторяется, я переписал его (некоторое время назад) для использования MySQLi, в частности, подготовленных операторов, так как существует всего три возможных запроса. В любом случае, теперь, на сервере PHP 5.3, скрипт разбивается на следующую строку:
mysqli_stmt_bind_result($prepCheck, $id1);
Где $prepCheck
создается с $prepCheck = mysqli_prepare($con, $checkQuery) or die("Error");
, Запрос выполняется отлично на сервере MySQL (это $ checkQuery), и PHP-код тоже работал на предыдущем сервере.
Запуск скрипта с strace
ничего не обнаружил, так как последнее в нем – системный вызов для echo "Execute";
, которое равно 29936 19:44:18 write(1, "Execute\n", 8) = 8
.
Объект соединения не является FALSE
, и даже если он был, он должен сбой с другой ошибкой, правильно?
Вот самая странная часть: эта процедура не сработает, когда я запускаю сценарий, ограничивая количество посещенных страниц и успешно завершая скрипт. Однако, когда я устанавливаю более высокий предел, он терпит неудачу, всегда при первом вызове этой процедуры и точно в этой строке.
Если у кого-то есть предложения, которые могут вызвать это, они будут глубоко оценены.
Я могу вставить код, если кому-то нужно увидеть увеличенное изображение, но процедура очень длинная и скучная до смерти (возможно, поэтому скрипт не работает :).
Вот как начинается скрипт: error_reporting(E_ALL); ini_set('display_errors', '1');
error_reporting(E_ALL); ini_set('display_errors', '1');
, Сообщается об ошибке, кроме «магической» Segmentation fault
. Я не использую APC.
Не уверен, что это актуально, но я использую CLI для запуска скрипта, а не для веб-интерфейса.
Версия PHP – 5.3.8, версия MySQL – 5.1.56. Предел памяти установлен в 64 МБ.
РЕДАКТИРОВАТЬ: процедура, в которой отсутствует + другой код, загружается здесь: http://codepad.org/KkZTxttQ . Весь файл огромный и уродливый, и я считаю неуместным, поэтому я его не публикую сейчас. Сбой линии – 113.
Ответ на мой вопрос, так как я решил проблему, и нет других ответов …
Кредит отправляется на @ jap1968 за то, что он указал мне на функцию mysqli_stmt_error (которая, как я полагала, мне не нужна, поскольку у меня есть error_reporting(E_ALL)
).
Проблема заключалась в том, что MySQL имел очень странную конфигурацию по умолчанию: особенно
connect_timeout = 10 wait_timeout = 30
Это заставило сервер MySQL закрыть соединение только через 30 секунд (по умолчанию это больше, чем полчаса, согласно веб-сайту MySQL). Это, в свою очередь, вызвало сбой функции mysqli_stmt_bind_result с ошибкой сегментации.