2015-04-03 3 views
0

Я хочу, чтобы eval(), чтобы сделать функцию, которая называет ее и заканчиваться. Но я не хочу останавливать все приложение.Прерывание функции, вызывающей eval изнутри eval

Я использую include для включения стороннего приложения в свое приложение. Третье приложение в конечном итоге вызывает функцию, которая сначала позволяет мне вводить код через крючок, а затем в конце функции он просто вызывает exit();.

Я не хочу редактировать их код вручную. И я также не хочу включать стороннее приложение, используя exec() или readfile() или curl(), или включать через http или любой другой подобный метод. Потому что я хочу, чтобы клиентский контекст оставался существующим по отношению к стороннему скрипту. (В противном случае сторонний скрипт будет считать, что мой собственный сервер является клиентом. Например, сторонний скрипт всегда будет видеть, что $_SERVER['REMOTE_ADDR'] - это 127.0.0.1. И я не хочу этого.)

Короче говоря, следующее происходит:

Мое приложение:

// do stuff 
// ... 
chdir("path/to/third/party/application"); 
include ("path/to/third/party/application/index.php"); 
chdir("path/to/my/application"); 
// ... 
// do more stuff 

приложение Третья сторона:

// do some stuff 
// ... 
doLastStuff(); 

function doLastStuff() { 
    // doing some last stuff 
    // ... 

    $hook = "..."; // get code from database 
    if ($hook) { 
     eval($hook); 
    } 
    exit(); 
} 

проблема заключается в том, что exit(); в конце также останавливает мой собственный скрипт. И я не хочу этого. Может ли кто-нибудь увидеть способ остановиться, чтобы избежать того, что exit() останавливает мой скрипт, изнутри крючка?

Я могу положить любую цепочку внутри $ hook.

+1

Eval = evil, просто давая вам знать :) –

ответ

0

Я исправил это сам уже. Хитрость заключалась в том, чтобы поднять исключение внутри кода eval'd. И включить включение в try/catch в моем собственном приложении.

Мое Применение:

// do stuff 
// ... 
chdir("path/to/third/party/application"); 
try { 
    include ("path/to/third/party/application/index.php"); 
} 
catch (Exception $e) { 
} 
chdir("path/to/my/application"); 
// ... 
// do more stuff 

Третьего приложение сторона:

// do some stuff 
// ... 
doLastStuff(); 

function doLastStuff() { 
    // doing some last stuff 
    // ... 

    $hook = "throw new Exception();"; // get code from database 

    if ($hook) { 
     eval($hook); 
    } 
    exit(); // will no longer be executed... 
} 

Я мог бы также поднять пользовательский производный класс Exception, так что я только поймать свой собственный Exception и оставить другие исключения неперехваченными.