Is there a way in PHP to try to include a file, but if the file contains errors that stop it from compiling to just skip that file from inclusion?
+4
A:
You can call php -l on the file in question. This will shell out and slow though. it doesn't handle runtime errors like die() though.
test.php:
<?php
function check_code_file($filename)
{
$filename = escapeshellcmd($filename);
system("php -l $filename 2>/dev/null 1>/dev/null", $status);
if ($status) return false;
return true;
}
if (check_code_file('test-good.php'))
{
include('test-good.php');
}
if (check_code_file('test-bad.php'))
{
include('test-bad.php');
}
print "finished\n";
test-good.php:
<?php
print "here\n";
test-bad.php:
<?php
die(
$ php test.php
here
finished
halkeye
2010-06-06 00:15:49
Not for compilation errors.
Artefacto
2010-06-06 00:18:07
yea sorry, rushed the test case a bit, had a typo. Redid it with one that works.
halkeye
2010-06-06 00:32:08
This solution can get expensive really quickly though.
halkeye
2010-06-06 00:33:27
I don't mind this not catching die statements, that's fine with me, as long as the code is checked for sanity that's really all that matters.@halkeye Thanks, I'm going to do some tests on this, and get back to you.
Mark Tomlin
2010-06-06 00:51:29
+1 creative solution
Mike B
2010-06-06 02:35:31
Brilliant answer sir, I shall use this! Thank you!
Mark Tomlin
2010-06-06 05:31:06
It should be noted that I'm using this, based of your code: function isSafeToInclude($filePath) { if (!file_exists($filePath)) return FALSE; system('php -l ' . escapeshellcmd($filePath), $status); if ($status) return FALSE; else return TRUE; }
Mark Tomlin
2010-06-06 06:36:00
A:
Depending on the PHP version you could use php_check_syntax() (practically the same as php -l).
But its a moo point really.. Either you need the stuff your trying to include or you dont include it.
Kuchen
2010-06-06 00:47:55
I don't need the stuff I'm trying to include, but it adds functionality to the code. So I'm trying to include safely.Also, I just checked, this function is deprecated as of 5.0.4. Thanks for the reply tho!
Mark Tomlin
2010-06-06 00:55:21
+1
A:
A less than ideal solution I thought I'd mention here for posterity. The original idea is here.
You can capture the E_PARSE error you would receive on a bad 'require' and hand it off to a shutdown function. The idea is to suppress the parsing error...
register_shutdown_function('post_plugin_include');
@require 'bad_include.php';
Then do your primary execution after the fact.
function post_plugin_include() {
if(is_null($e = error_get_last()) === false) {
// do something else
}
}
Like I said, less than ideal but interesting nonetheless.
Inkspeak
2010-06-06 13:06:35
I've never seen that before, and it offers some interesting ideas. Thanks for sharing. +1
Mark Tomlin
2010-06-07 05:07:52