请解释如何创建PHP';s Phar存根
我正在尝试创建一个非常简单的PHP CLI应用程序,它可以从命令行作为文件运行:请解释如何创建PHP';s Phar存根,php,stub,phar,Php,Stub,Phar,我正在尝试创建一个非常简单的PHP CLI应用程序,它可以从命令行作为文件运行: # php myProject.phar # cd MyProject # php bootstrap.php 这就是我迄今为止所尝试的: 我的项目 我的项目位于名为MyProject的目录中,其中包含以下两个文件: |-- createPhar.php `-- bootstrap.php bootstrap.php bootstrap.php文件包含以下内容: <?php print phpve
# php myProject.phar
# cd MyProject
# php bootstrap.php
这就是我迄今为止所尝试的:
我的项目
我的项目位于名为MyProject
的目录中,其中包含以下两个文件:
|-- createPhar.php
`-- bootstrap.php
bootstrap.php
bootstrap.php
文件包含以下内容:
<?php
print phpversion() . PHP_EOL;
print 'i am some script' . PHP_EOL;
我得到以下输出:
5.3.2-1ubuntu4.9
i am some script
createPhar.php
createPhar.php文件旨在将项目转换为Phar归档文件。
看起来是这样的:
<?php
$phar = new Phar('MyProject.phar');
$phar->addFile('bootstrap.php');
$phar->setStub( $phar->createDefaultStub('bootstrap.php') );
。。。在我的项目目录中创建了一个名为MyProject.phar
的新文件
|-- bootstrap.php
|-- createPhar.php
`-- MyProject.phar
现在问题来了
当我运行phar文件时
# php MyProject.phar
…我希望看到与运行bootstrap.php
脚本时相同的输出
相反,我什么也看不见。根本没有输出。这意味着由$phar->createDefaultStub('bootstrap.php')
我想我误解了Phar和他们的存根是如何产生的。请你解释一下我哪里出错了。你也可以这样做:
<?php
$phar = new Phar('MyProject.phar');
$phar->addFile('bootstrap.php');
$phar->setStub( $phar->createDefaultStub('bootstrap.php') );
bootstrap.php强>
<?php
function go() {
print phpversion() . PHP_EOL;
print 'i am some script' . PHP_EOL;
}
回答我自己的问题 上面我的问题中概述的方法是创建phar/phar存根的一种正确方法 为什么它对我不起作用,对马里奥也起作用(见他在问题下面的评论),是因为我安装了Suhosin,需要调整设置 使用以下选项修复: 要修复,请将: suhosin.executor.include.whitelist=“phar” 在/etc/php5/cli/php.ini中
你的例子对我很有用。但是请尝试使用
->setDefaultStub
快捷方式(over::createDefault和::setStub)进行测试。谢谢mario。我尝试使用->setDefaultStub
,但它仍然不起作用。奇怪的是,你让它工作,我却没有。我想问题不在于代码。我的PHP_版本
是5.3.3-1ubuntu9.5
,但其间只有一个与phar扩展相关的小安全漏洞修复。一定是别的原因。您是否使用hexeditor查看生成的文件?引导内容是否在其中的任何位置?(我得到了一个简单的php脚本,里面混合了一些二进制乱码。)是的。看了一下MyProject.phar
,里面有引导代码和一些胡言乱语。谢谢你的建议。我怀疑我在做一些非常愚蠢的事情,所以我要好好考虑一下,明天再试一次。谢谢你的建议。我试过使用函数,但没有。运行'php-r“require”phar://Myproject.phar';"`. 真正奇怪的是,如果我一起删除phar文件,然后运行'php-r“ini_set('display_errors',1);error_reporting(E_ALL);require'phar://Myproject.phar“;”`我仍然没有得到任何输出。这是Linux并且启用了SELinux吗?还有系统错误吗?啊哈!对系统日志显示了一些东西。我通过管道将syslog
文件的输出传输到grep
中,以了解对php的任何提及:cat/var/log/syslog | grep php
。看起来苏霍辛在插手:Jun 13 21:43:41 ubuntu苏霍辛[3264]:警报-包括文件名('phar:///MyProject/MyProject.phar/bootstrap.php“)是不允许的URL(攻击者“未设置远程地址”,文件“/MyProject/MyProject.phar”,第9行)
Yep。这就是问题所在。固定使用。谢谢你的帮助。