Я хочу иметь display_errors=on в php.ini, чтобы получать больше информации, чем просто «500», при разработке PHP-скриптов для моего веб-сайта на общем сервере.
Я узнал, что для этого требуется модификация php.ini, что в моем случае невозможно.
отчеты phpinfo
Loaded Configuration File /etc/php8.2/php.ini
Scan this dir for additional .ini files (none)
Конечно, я не могу изменять файлы на /etc/php8.2/
По крайней мере, я могу это прочитать и найти там display_errors=off
.
Каков синтаксис ini_set для добавления собственного каталога для сканирования дополнительного php.ini?
Я заметил, что очень глупые синтаксические ошибки (например, отсутствие точки с запятой) не фиксируются
ini_set("log_errors", 1);
ini_set("error_log", getcwd() . "/php-error.log");
потому что они происходят во время компиляции, задолго до выполнения ini_set (и даже настроек .htaccess) и т. д.
Если вы обслуживаете веб-сайт через PHP-FPM
, вы можете использовать .user.ini
Если ваш сервер поддерживает использование файлов .htaccess, вы можете попробовать добавить в этот файл собственные настройки, например. php_value display_errors 1
.
P.S. Для разработки гораздо лучше иметь на своем компьютере среду разработки с установленным PHP и т. д. Затем вы можете настроить это для отображения ошибок непосредственно в выводе, если вам так проще. После того как ваш скрипт будет разработан и протестирован, вы сможете развернуть его на сервере для реального использования пользователями. Это упрощает разработку и тестирование, не создает риска вмешательства в вашу реальную среду и означает, что легче работать над улучшением сценария, пока текущий еще активно используется. Разработка непосредственно на сервере — очень неоптимальное решение.
Если вы используете WordPress, вы можете попробовать использовать мой плагин, который поддерживает изменение настроек PHP с помощью файла .htaccess или .user.ini: wordpress.org/plugins/custom-php-settings
Этот вопрос похож на: Как я могу получать полезные сообщения об ошибках в PHP?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.
Кроме того, может быть интересно использовать такой инструмент, как Sentry, для регистрации таких ошибок в инструменте, где вы можете найти их лучше, чем в любом текстовом файле журнала, и это намного лучше, чем показывать все необработанные сообщения об ошибках вашим клиентам.
Спасибо @Cyclonecode, @ADyson и @Nico Haase за ваши подсказки.
Конечно, установка собственного веб-сервера и PHP и, в конечном итоге, базы данных с тестовыми данными будет лучше в долгосрочной перспективе. Моя единственная мера безопасности, позволяющая скрыть неработающую страницу от других пользователей, — это временное и еще не связанное имя страницы. Не слишком профессионально, признаюсь. Еще одной подсказкой может быть редактор с лучшей проверкой синтаксиса PHP, чем у Notepad++. Дополнительные методы ini_set, упомянутые в ссылке @Nico, просто изменили формат ответа HTTP CODE 500, не повезло.
Я перепробовал все, что нашел до сих пор, включая подход .htaccess, но безуспешно (имею к нему доступ и могу, например, настроить страницу 404).
Но я нашел другое решение (где-то в stackoverflow?), еще не упомянутое: если синтаксическая ошибка находится внутри включаемого файла, об этом сообщается на экране. Независимо от того, вызывается ли ошибочная функция.
Образец:
<!DOCTYPE html>
<html><head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width">
<title> PHP Test Environment </title>
</head>
<body>
<?php
ini_set("log_errors", 1);
ini_set("error_log", getcwd() . "/php-error.log");
function shutDownFunction() {
echo "shutdown_function running";
$error = error_get_last();
if ($error['type'] === E_ERROR) print_r ($error);
}
register_shutdown_function('shutDownFunction');
include './db_functions.php'; // supplies connect(), getID(), getTimeSeries()
try {
include './error.php'; // Syntax error in there is reported on screen
$db = connect();
if ($db) echo "Connected ! <br>";
$ID = getID($db, "Gesamt");
$pos = 6;
$time = '2024-06-26';
echo json_encode(getTimeSeries($db, $ID, $pos, $time, 4));
$db -> close();
// x // if comment removed, error here is not shown, simply reporting `HTTP ERROR 500`
} catch (\Throwable $t) {
echo $t->getMessage(), " at ", $t->getFile(), ":", $t->getLine(), "<br>";
}
?>
<p>Done</p>
</body>
Это включенный файл error.php
:
<?php
function wrong_getID(&$db) {
xyz // error here
$ID = 0;
$q = "SELECT ID FROM Device WHERE Name='xyz'";
$result = $db->query($q);
if ($result && $result->num_rows == 1)
$ID = $result->fetch_array(MYSQLI_NUM)[0];
return $ID;
}
?>
Поэтому поместите весь PHP-код во включенный файл и просто добавьте попробуйте {} catch (throwable) на самой странице, это может помочь.
"SELECT ID FROM Device WHERE Name='".$name."';"
— имейте в виду, что такие запросы очень уязвимы для SQL-инъекций. Ознакомьтесь с подготовленными заявлениями, чтобы избежать взлома
См. Как включить переменную PHP в оператор MySQL, чтобы понять, что сказал Нико.
Правильный. Это просто для того, чтобы предоставить полный образец с несколькими строками для чтения. Извините, что от этого у вас сразу зазвонит колокольчик. ;)
Конечно, это так. Имейте в виду, что вы публикуете ответ не только для себя, но и для других, и что код, указанный в ответе, небезопасен.
Я опубликовал образец неправильного кода, который сейчас изменил, чтобы он стал довольно бесполезным, но больше не был небезопасным, когда ошибка будет исправлена. Другая проблема, связанная с отправкой пользователям сообщений об ошибках, также сомнительна и ее следует устранить при публикации.
`xyz // здесь ошибка` - мне это кажется очевидным: код не может быть разобран
Вы правы, @Nico Haase, это тема этого выпуска: как заставить PHP-код выявлять свои ошибки. Если компиляция не удалась, весь код, связанный с журналированием и т. д., не поможет. пример кода должен быть очевидным. Решение/обходной путь — поместить этот сомнительный код во включенный файл. В комментариях к вопросу было предложено использовать редактор с лучшей проверкой синтаксиса PHP.
Если это сервер общего хостинга и подключен к Интернету, возможно, он настроен на запись ошибок в файл, а не на отображение их на экране — это разумно как для безопасности, так и для лучшего взаимодействия с пользователем. Если вы не можете найти файл журнала PHP для просмотра ошибок, обратитесь к системному администратору или в службу поддержки.