我一直在使用PECL bcompiler扩展。一切都很好。 但是,我发现将工作脚本移动到另一个Linux系统(CentOS - > FreeBSD)会导致将bcompiled程序部分包含到基本脚本(运行时屏幕上出现垃圾)的问题。 PHP(5.2.10)和bcompiler扩展(最新版本)的版本是相同的。所有源都安装在两个Linux系统中都没有错误。使用dl()函数正确加载B编译器:没有错误,所有bcompiler的函数都在工作。
我试图将任务分为两部分:
CentOS:仅编译没有页眉和页脚的内容:
function bc($ext = "b")
{
global $SCRIPT_DIR, $INCLUDES;
echo "Bcompiler is loaded. Compiling modules ... \n";
foreach($INCLUDES as $inc_file){
echo "$inc_file.php ";
$php_file = "$SCRIPT_DIR/include/$inc_file.php";
if(!file_exists($php_file)){
echo "not found!\n"; continue;
}
else echo "=> $inc_file.$ext\n";
$fh = fopen("$SCRIPT_DIR/modules/b/$inc_file.$ext", "w");
bcompiler_write_file($fh, $php_file);
fclose($fh);
}
return;
}
FreeBSD:在已编译的模块中添加页眉和页脚:
function b2bin()
{
global $SCRIPT_DIR, $INCLUDES;
echo "Bcompiler is loaded. Processing modules ... \n";
foreach($INCLUDES as $inc_file){
echo "$inc_file.b ";
$b_file = "$SCRIPT_DIR/modules/$inc_file.b"; // without header and footer
if(!file_exists($b_file)){
echo "not found!\n"; continue;
}
else echo "=> $inc_file.bin\n";
$content = file_get_contents($b_file);
$target_bin_file="$SCRIPT_DIR/modules/$inc_file.bin"; // with header and footer
$fh = fopen($target_bin_file, "w");
bcompiler_write_header($fh);
fwrite($fh,$content);
bcompiler_write_footer($fh);
fclose($fh);
}
return;
}
在FreeBSD上启动主程序[filename.php]:
if(!extension_loaded('bcompiler')) dl('bcompiler.so');
if(!function_exists("bcompiler_read")){
exit("error: PHP Bcompiler module not loaded. Install Bcompiler from https://pecl.php.net/package/bcompiler.\n");
}
/*line 40*/ foreach( $INCLUDES as $inc_file) include_once ("$SCRIPT_DIR/modules/$inc_file.bin");
shedule_run();
...and so on...
垃圾邮件消失,但PHP通知:致命错误:无法继承[第40行的[filename.php]。同时,两个系统上的页眉和页脚的完整编译给出了积极的结果。
问题出现了:Bcompiled字节码是否对父系统是唯一的,以及我如何解决问题。我的重要任务是将已编译的模块自由传输到安装了PHP和Bcompiler的各种Linux系统。