views:

141

answers:

3

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
Not for compilation errors.
Artefacto
yea sorry, rushed the test case a bit, had a typo. Redid it with one that works.
halkeye
This solution can get expensive really quickly though.
halkeye
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
+1 creative solution
Mike B
Brilliant answer sir, I shall use this! Thank you!
Mark Tomlin
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
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
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
+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
I've never seen that before, and it offers some interesting ideas. Thanks for sharing. +1
Mark Tomlin
@Mark Tomlin, Certainly.
Inkspeak