I have checked my PHP ini file (php.ini
) and display_errors
is set and also error reporting is E_ALL
. I have restarted my Apache webserver.
I have even put these lines at the top of my script, and it doesn't even catch simple parse errors. For example, I declare variables with a "$"
and I don't close statements";"
. But all my scripts show a blank page on these errors, but I want to actually see the errors in my browser output.
error_reporting(E_ALL);
ini_set('display_errors', 1);
What is left to do?
$_REQUEST
parameter) these two lines will work most of the time. - anyone This always works for me:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
However, this doesn't make PHP to show parse errors occurred in the same file. Also, these settings can be overridden by PHP. In these cases the only way to show those errors is to modify your php.ini (or php-fpm.conf) with this line:
display_errors = on
(if you don't have access to php.ini
, then putting this line in .htaccess
might work too):
php_flag display_errors 1
Note that above recommendation is only suitable for the DEV environment. On a live site it must be
display_errors = off
log_errors = on
And then you'll be able to see all errors in the error log. See Where to find PHP error log
In case of AJAX call, on a DEV server, open DevTools (F12), then Network tab. Then initiate the request which result you want to see, and it will appear in the Network tab. Click on it and then the Response tab. There you will see the exact output.
While on a live server just check the error log all the same.
Answered 2023-09-20 21:01:25
php_flag display_errors 1
for .htaccess - anyone E_ALL
isn't sufficient to display all errors in PHP 5.3. "E_STRICT
became part of E_ALL
in 5.4.0" - PHP Manual You need E_ALL | E_STRICT
or -1
in that version. - anyone PHP.ini
, Few have a .htaccess
file ... The ability to edit their PHP.ini file is another thing.. And most public servers allow for a custom php.ini file to be used.. - anyone You can't catch parse errors in the same file where error output is enabled at runtime, because it parses the file before actually executing anything (and since it encounters an error during this, it won't execute anything). You'll need to change the actual server configuration so that display_errors is on and the approriate error_reporting level is used. If you don't have access to php.ini, you may be able to use .htaccess or similar, depending on the server.
This question may provide additional info.
Answered 2023-09-20 21:01:25
Inside your php.ini:
display_errors = on
Then restart your web server.
Answered 2023-09-20 21:01:25
sudo service apache2 restart
- anyone sudo apachectl -k restart
. - anyone Loaded Configuration File
- anyone ini_get('display_errors')
and it returns an empty string (meaning it is turned off). And yes I checked to make sure it is the only line in the configuration file. The setting is getting overridden somehow and I can't figure out why and it is driving me nuts. Yes, I've searched everything in /etc/php.d/
and it is not one of those files either. Yes, I restarted the web server too. No, there is nothing in the .htaccess
file. I'm using PHP 7.4.6. - anyone To display all errors you need to:
1. Have these lines in the PHP script you're calling from the browser (typically index.php
):
error_reporting(E_ALL);
ini_set('display_errors', '1');
2.(a) Make sure that this script has no syntax errors
—or—
2.(b) Set display_errors = On
in your php.ini
Otherwise, it can't even run those 2 lines!
You can check for syntax errors in your script by running (at the command line):
php -l index.php
If you include the script from another PHP script then it will display syntax errors in the included script. For example:
index.php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Any syntax errors here will result in a blank screen in the browser
include 'my_script.php';
my_script.php
adjfkj // This syntax error will be displayed in the browser
Answered 2023-09-20 21:01:25
Some web hosting providers allow you to change PHP parameters in the .htaccess
file.
You can add the following line:
php_value display_errors 1
I had the same issue as yours and this solution fixed it.
Answered 2023-09-20 21:01:25
Warning: the below answer is factually incorrect. Nothing has been changed in error handling, uncaught exceptions are displayed just like other errors. Suggested approach must be used with caution, because it outputs errors unconditionally, despite the display_error setting and may pose a threat by revealing the sensitive information to an outsider on a live site.
You might find all of the settings for "error reporting" or "display errors" do not appear to work in PHP 7. That is because error handling has changed. Try this instead:
try{
// Your code
}
catch(Error $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
Or, to catch exceptions and errors in one go (this is not backward compatible with PHP 5):
try{
// Your code
}
catch(Throwable $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
Answered 2023-09-20 21:01:25
try{} catch() {}
code everywhere in your already defined php code, I don't even want to think the mess that's going to be.. - anyone $bt = debug_backtrace(); print_r($bt);
. - anyone Error
. If you rewrite all requests (except maybe JavaScript, CSS, Images, etc) to the index.php file, then have the try catch block there, it makes it easier. Yes, any system that does not have a single entry point would be a major headache to update. - anyone This will work:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
Answered 2023-09-20 21:01:25
Use:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
This is the best way to write it, but a syntax error gives blank output, so use the console to check for syntax errors. The best way to debug PHP code is to use the console; run the following:
php -l phpfilename.php
Answered 2023-09-20 21:01:25
Set this in your index.php file:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Answered 2023-09-20 21:01:25
Create a file called php.ini in the folder where your PHP file resides.
Inside php.ini add the following code (I am giving an simple error showing code):
display_errors = on
display_startup_errors = on
Answered 2023-09-20 21:01:25
In order to display a parse error, instead of setting display_errors
in php.ini you can use a trick: use include.
Here are three pieces of code:
File: tst1.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// Missing " and ;
echo "Testing
When running this file directly, it will show nothing, given display_errors
is set to 0 in php.ini.
Now, try this:
File: tst2.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include ("tst3.php");
File: tst3.php
<?php
// Missing " and ;
echo "Testing
Now run tst2.php which sets the error reporting, and then include tst3. You will see:
Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in tst3.php on line 4
Answered 2023-09-20 21:01:25
init0.php
, and from that file include init1.php
, which can include other files with errors in them. It won't work if enabling error reporting in the same file that includes other files with errors in them. - anyone If, despite following all of the above answers (or you can't edit your php.ini file), you still can't get an error message, try making a new PHP file that enables error reporting and then include the problem file. eg:
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');
Despite having everything set properly in my php.ini
file, this was the only way I could catch a namespace error. My exact scenario was:
//file1.php
namespace a\b;
class x {
...
}
//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
...
}
Answered 2023-09-20 21:01:25
I would usually go with the following code in my plain PHP projects.
if(!defined('ENVIRONMENT')){
define('ENVIRONMENT', 'DEVELOPMENT');
}
$base_url = null;
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'DEVELOPMENT':
$base_url = 'http://localhost/product/';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
break;
case 'PRODUCTION':
$base_url = 'Production URL'; /* https://google.com */
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
ini_set('log_errors', 1); // Mechanism to log errors
break;
default:
exit('The application environment is not set correctly.');
}
}
Answered 2023-09-20 21:01:25
If you somehow find yourself in a situation where you can't modifiy the setting via php.ini
or .htaccess
you're out of luck for displaying errors when your PHP scripts contain parse errors. You'd then have to resolve to linting the files on the command line like this:
find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"
If your host is so locked down that it does not allow changing the value via php.ini
or .htaccess
, it may also disallow changing the value via ini_set
. You can check that with the following PHP script:
<?php
if( !ini_set( 'display_errors', 1 ) ) {
echo "display_errors cannot be set.";
} else {
echo "changing display_errors via script is possible.";
}
Answered 2023-09-20 21:01:25
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'
is simpler - anyone You can do something like below:
Set the below parameters in your main index file:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
Then based on your requirement you can choose which you want to show:
For all errors, warnings and notices:
error_reporting(E_ALL); OR error_reporting(-1);
For all errors:
error_reporting(E_ERROR);
For all warnings:
error_reporting(E_WARNING);
For all notices:
error_reporting(E_NOTICE);
For more information, check here.
Answered 2023-09-20 21:01:25
index.html
? - anyone You can add your own custom error handler, which can provide extra debug information. Furthermore, you can set it up to send you the information via email.
function ERR_HANDLER($errno, $errstr, $errfile, $errline){
$msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
<b>File:</b> $errfile <br>
<b>Line:</b> $errline <br>
<pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";
echo $msg;
return false;
}
function EXC_HANDLER($exception){
ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}
function shutDownFunction() {
$error = error_get_last();
if ($error["type"] == 1) {
ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
}
}
set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");
Answered 2023-09-20 21:01:25
Accepted asnwer including extra options. In PHP files for in my DEVELOPMENT apache vhost (.htaccess if you can ensure it doesn't get into production):
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
However, this doesn't make PHP to show parse errors - the only way to show those errors is to modify your php.ini with this line:
display_errors = on
(if you don't have access to php.ini
, then putting this line in .htaccess
might work too):
// I've added some extra options that set E_ALL as per https://www.php.net/manual/en/errorfunc.configuration.php.
php_flag log_errors on
php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2147483647
php_value error_log /var/www/mywebsite.ext/logs/php.error.log
Answered 2023-09-20 21:01:25
This code on top should work:
error_reporting(E_ALL);
However, try to edit the code on the phone in the file:
error_reporting =on
Answered 2023-09-20 21:01:25
The best/easy/fast solution that you can use if it's a quick debugging, is to surround your code with catching exceptions. That's what I'm doing when I want to check something fast in production.
try {
// Page code
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
Answered 2023-09-20 21:01:25
catch (Throwable $e)
is better... Or another catch block underneath catch(Error $e)
- anyone <?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
While your site is live, the php.ini
file should have display_errors disabled for security reasons. However, for the development environment, display_errors can be enabled for troubleshooting.
Answered 2023-09-20 21:01:25
If you have Xdebug installed you can override every setting by setting:
xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;
force_display_errors
Type: int, Default value: 0, Introduced in Xdebug >= 2.3 If this setting is set to 1 then errors will always be displayed, no matter what the setting of PHP's display_errors is.
force_error_reporting
Type: int, Default value: 0, Introduced in Xdebug >= 2.3 This setting is a bitmask, like error_reporting. This bitmask will be logically ORed with the bitmask represented by error_reporting to dermine which errors should be displayed. This setting can only be made in php.ini and allows you to force certain errors from being shown no matter what an application does with ini_set().
Answered 2023-09-20 21:01:25
If it is on the command line, you can run php
with -ddisplay_errors=1
to override the setting in php.ini
:
php -ddisplay_errors=1 script.php
Answered 2023-09-20 21:01:25
Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
Display all PHP errors
error_reporting(E_ALL); or ini_set('error_reporting', E_ALL);
Turn off all error reporting
error_reporting(0);
Answered 2023-09-20 21:01:25
In Unix CLI, it's very practical to redirect only errors to a file:
./script 2> errors.log
From your script, either use var_dump()
or equivalent as usual (both STDOUT and STDERR will receive the output), but to write only in the log file:
fwrite(STDERR, "Debug infos\n"); // Write in errors.log^
Then from another shell, for live changes:
tail -f errors.log
or simply
watch cat errors.log
Answered 2023-09-20 21:01:25
./script
is a php CLI script (hashbang #!/usr/bin/php
). You can redirect the php errors in a file this way. This is unix piping. This is not php as CGI. - anyone If you are on a SharedHosting plan (like on hostgator)... simply adding
php_flag display_errors 1
into a .htaccess file and uploading it to the remote folder may not yield the actual warnings/errors that were generated on the server.
What you will also need to do is edit the php.ini
This is how you do it via cPanel (tested on hostgator shared hosting plan)
After logging into your cPanel, search for MultiPHP INI Editor. It is usually found under the SOFTWARE section in your cPanel list of items.
On the MultiPHP INI Editor page ...you can stay on the basic mode tab and just check the button on the line that says display_errors. Then click the Apply button to save.
IMPORTANT: Just remember to turn it back off when you are done debugging; because this is not recommended for public servers.
Answered 2023-09-20 21:01:25
As it is not clear what OS you are on these are my 2 Windows cents.
If you are using XAMPP you need to manually create the logs
folder under C:\xampp\php
. Not your fault, ApacheFriends ommitted this.
To read and follow this file do.
Get-Content c:\xampp\php\logs\php_error_log -Wait
To do this in VSCode create a task in .vscode\tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Monitor php errors",
"type": "shell",
"command": "Get-Content -Wait c:\\xampp\\php\\logs\\php_error_log",
"runOptions": {
"runOn": "folderOpen"
}
}
]
and have it run on folder load.
Answered 2023-09-20 21:01:25