【问题标题】:Please explain how to create PHP's Phar stubs请解释如何创建 PHP 的 Phar 存根
【发布时间】:2011-06-13 20:47:38
【问题描述】:

我正在尝试创建一个非常简单的 PHP CLI 应用程序,它可以从命令行以 phar 文件的形式运行:

# php myProject.phar

这是我迄今为止尝试过的:

我的项目

我的项目位于名为MyProject 的目录中,其中包含以下两个文件:

 |-- createPhar.php
 `-- bootstrap.php

bootstrap.php

bootstrap.php 文件包含以下内容:

<?php
print phpversion() . PHP_EOL;
print 'i am some script' . PHP_EOL;

当我从 Ubuntu 命令行运行此脚本时:

# cd MyProject 
# php bootstrap.php

我得到以下输出:

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') );

当我运行该脚本时...

# php createPhar.php

...在我的项目目录中创建了一个名为 MyProject.phar 的新文件。

|-- bootstrap.php
|-- createPhar.php
`-- MyProject.phar

现在问题来了

当我运行 phar 文件时...

# php MyProject.phar 

...我希望看到与运行bootstrap.php 脚本时相同的输出。

相反,我什么也没看到。根本没有输出。这意味着$phar-&gt;createDefaultStub('bootstrap.php') 创建的默认存根不包含我的bootstrap.php 脚本

我想我误解了 Phar 及其存根是如何创建的。请你解释一下我哪里出错了。

【问题讨论】:

  • 你的例子对我有用。但请尝试使用 -&gt;setDefaultStub 快捷方式(通过 ::createDefault 和 ::setStub)进行测试。
  • 谢谢马里奥。我尝试使用-&gt;setDefaultStub,但它仍然无法正常工作。奇怪的是你让它工作而我没有。我想问题与代码无关。
  • 我的 PHP_VERSION5.3.3-1ubuntu9.5,但只有一个与 phar 扩展相关的小安全错误修复。它一定是别的东西。您是否使用 hexeditor 查看了生成的文件?引导内容是否在其中的任何位置? (我得到了一个带有一些混合二进制乱码的普通 php 脚本。)
  • 是的。看看MyProject.phar,里面有引导代码和一些乱码。感谢您的建议。我怀疑我在某个地方做了一些非常愚蠢的事情——所以我要睡着了,明天再试一次。

标签: php stub phar


【解决方案1】:

回答我自己的问题。

上面我的问题中概述的方法是创建 phar / phar 存根的一种正确方法。

它对我不起作用而 确实 对 Mario 起作用的原因(请参阅问题下方他的评论),是因为我安装了 Suhosin 并且需要调整设置。

使用technique outlined here修复:

要修复,请输入:

suhosin.executor.include.whitelist="phar"

在 /etc/php5/cli/php.ini

【讨论】:

    【解决方案2】:

    你也可以这样做:

    bootstrap.php;

    <?php
    function go() {
        print phpversion() . PHP_EOL;
        print 'i am some script' . PHP_EOL;
    }
    

    然后:

    php -r "要求 'phar://Myproject.phar';去();"

    或者没有函数,它会执行你在其中的任何命令,但通常你会在 phar 中有一些函数或类文件。

    【讨论】:

    • 感谢您的建议。我尝试了一个功能和没有。跑`php -r“要求'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。看来 suhosin 插手了:Jun 13 21:43:41 ubuntu suhosin[3264]: ALERT - Include filename ('phar:///MyProject/MyProject.phar/bootstrap.php') is an URL that is not allowed (attacker 'REMOTE_ADDR not set', file '/MyProject/MyProject.phar', line 9)
    • 是的。这就是问题所在。使用the technique outlined here 修复。感谢您的帮助。
    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多