Ci4 + Php 8.1: наконец -то блокируется, не выполняемый, когда происходит mysqli_sql_exception (но работает с Register_shPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Ci4 + Php 8.1: наконец -то блокируется, не выполняемый, когда происходит mysqli_sql_exception (но работает с Register_sh

Сообщение Anonymous »

Я работаю над проектом Codeigniter 4 (CI: 4.4.3 Режим производства | PHP: 8.1.32), и я сталкиваюсь с странной проблемой, в которой мой наконец block никогда не выполняет , если ошибка базы данных происходит во время выполнения - даже если я поймаю \ thropable (и не удаляет файл блокировки). Register_shutdown_function () , он работает и очищает файл блокировки.
Вот минимальное воспроизведение: Метод в Cronrunner

Код: Выделить всё

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);
//   }
// });

try {
$this->notifyLongRunningTask();
} catch (\Throwable $e2) {
$result = $e2->getMessage();
log_message('error', (string) $result);
} finally {
log_message('error', 'FINALLY BLOCK REACHED');
if (file_exists($lockFile)) {
unlink($lockFile);
}
}

return ['result' => $result];
}
}
< /code>

 Здесь 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
";

$query = $db->query($sql);

foreach ($query->getResult() as $row) {
$startedAt = strtotime($row->date_started . ' ' . $row->time_started);
$now = time();

// 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
и запрос запускается из метода select () нашего класса на основе CI_Model. Этот метод включает в себя эту логику: < /p>

Код: Выделить всё

if (!$query) {
$error = $db->error()["message"];
$baseClass = get_parent_class($this);
$this->log_it($error, $baseClass . " " . __FUNCTION__ . ' DB Error');
return ['result' => (string) $error];
}
Таким образом, ошибка SQL:
  • поймал
  • как часть ['result' => '...']
    Но все же - каким -то образом - это вызывает php/ci4 до завершить выполнение, прежде чем, наконец, runs , а файл блокировки не удален .

    что работает
    , если я не знаю регистрации, а затем код блокировки> . удален, как и ожидалось. < /p>
    Это говорит мне , сценарий неожиданно закрывается < /strong>, несмотря на \ throwable < /code>, и нет exit () < /code> или смертельный. CI4 (последняя стабильная) < /li> устанавливается на false (режим производства)
  • Запрос не выполняется с типичной неоднозначной ошибкой столбца
  • Он обрабатывается внутри select ()
  • Но наконец -то block от run () li>

    Подробнее здесь: https://stackoverflow.com/questions/796 ... occurs-but
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»