Я работаю над проектом Codeigniter 4 (CI: 4.4.3 Режим производства | PHP: 8.1.32), и я сталкиваюсь с странной проблемой, в которой мой наконец block никогда не выполняет , если ошибка базы данных происходит во время выполнения - даже если я поймаю \ thropable (и не удаляет файл блокировки). Register_shutdown_function () , он работает и очищает файл блокировки.
Вот минимальное воспроизведение:
как часть ['result' => '...']
Но все же - каким -то образом - это вызывает php/ci4 до завершить выполнение, прежде чем, наконец, runs , а файл блокировки не удален .
что работает
, если я не знаю регистрации, а затем код блокировки> . удален, как и ожидалось. < /p>
Это говорит мне , сценарий неожиданно закрывается < /strong>, несмотря на \ throwable < /code>, и нет exit () < /code> или смертельный. CI4 (последняя стабильная) < /li>
Я работаю над проектом Codeigniter 4 (CI: 4.4.3 Режим производства | PHP: 8.1.32), и я сталкиваюсь с странной проблемой, в которой мой наконец block [b] никогда не выполняет [/b], если ошибка базы данных происходит во время выполнения - даже если я поймаю \ thropable (и не удаляет файл блокировки). Register_shutdown_function () , он работает и очищает файл блокировки. Вот минимальное воспроизведение: [code]run()[/code] Метод в Cronrunner [code]namespace App\Models;
class CronRunner extends CI_Model {
public function run($data) {
$result = "OK";
$executedAt = date('Y-m-d H:i:s'); // for logs $executedAtUnix = time(); // for duration calc
$lockFile = WRITEPATH . 'cache/cronRunner.lock';
if (file_exists($lockFile)) return;
file_put_contents($lockFile, ENVIRONMENT);
// This works — when it's enabled, the file gets removed // register_shutdown_function(function () use ($lockFile) { // if (file_exists($lockFile)) { // unlink($lockFile); // } // });
Здесь notifylongrunningtask () < /code> < /h3> function notifyLongRunningTask() { $PushSubscriptions = new PushSubscriptions(); $PushSentLog = new PushSentLog();
$db = \Config\Database::connect();
$sql = " SELECT hs.id as hourly_id, date_started, time_started, hs.organization_id, hs.user_created, c.name Client, p.client_id FROM HourlySheet hs JOIN ToDo t ON hs.todo_id = t.id JOIN Project p ON t.project_id = p.id JOIN Client c ON p.client_id = c.id WHERE time_finished IS NULL ";
// This line causes the issue $PushSentLog_res = $PushSentLog->select(" AND user_created = {$row->user_created} AND name = 'notifyLongRunningTask' ORDER BY id DESC LIMIT 1 ");
// ... } } < /code>
Фактическая ошибка запроса < /h3> mysqli_sql_exception: Column 'name' in WHERE is ambiguous [/code] и запрос запускается из метода select () нашего класса на основе CI_Model. Этот метод включает в себя эту логику: < /p> [code]if (!$query) { $error = $db->error()["message"]; $baseClass = get_parent_class($this); $this->log_it($error, $baseClass . " " . __FUNCTION__ . ' DB Error'); return ['result' => (string) $error]; } [/code] Таким образом, ошибка SQL: [list] [*] [b] поймал [/b] [*] [b] [/b] [*] [b] [/b] как часть ['result' => '...'] Но все же - каким -то образом - это вызывает php/ci4 до [b] завершить выполнение, прежде чем, наконец, runs [/b], а файл блокировки [b] не удален [/b].
что работает , если я не знаю регистрации, а затем код блокировки> . удален, как и ожидалось. < /p> Это говорит мне [b], сценарий неожиданно закрывается < /strong>, несмотря на \ throwable < /code>, и нет exit () < /code> или смертельный. CI4 (последняя стабильная) < /li> [code]DBDebug[/code] устанавливается на false (режим производства) [*] Запрос не выполняется с типичной неоднозначной ошибкой столбца [*] Он обрабатывается внутри select () [*] Но наконец -то block от run () li>