将整个 Slim 应用程序打包到 Phar 文件中时出错

Posted

技术标签:

【中文标题】将整个 Slim 应用程序打包到 Phar 文件中时出错【英文标题】:Error Packaging into a Phar file an entire Slim Application 【发布时间】:2015-07-22 09:10:24 【问题描述】:

我有一个具有以下目录结构的 Slim 应用程序:

app/
vendor/
www/

config.php

在 app/ 我有项目的相关文件,在 vendor/ 由 composer 管理的依赖项和在 www/ Web 服务器可访问的文件。

所以我正在考虑按照以下方式创建一个 Phar 文件:

<?php

$full_path = '/home/.../forms/';
$package_name = 'www/package.phar';

try 
    $phar = new Phar($full_path . $package_name, 
    FilesystemIterator::CURRENT_AS_FILEINFO |       FilesystemIterator::KEY_AS_FILENAME, $full_path . $package_name);

$phar->startBuffering();

$phar->addFile($full_path . 'www/index.php');
$phar->addFile($full_path . 'www/bootstrap.php');
$phar->addFile($full_path . 'www/session_start.php');


// Grab config
$phar->addFile($full_path . 'config.php');


$phar->buildFromIterator(new RecursiveIteratorIterator (new RecursiveDirectoryIterator('../app', FilesystemIterator::SKIP_DOTS)),'../app');
$phar->buildFromIterator(new RecursiveIteratorIterator (new RecursiveDirectoryIterator('../vendor', FilesystemIterator::SKIP_DOTS)),'../vendor');

$phar->setDefaultStub('bootstrap.php', 'bootstrap.php');

$phar->stopBuffering();

echo "Phar created.";

 catch (Exception $e) 
// handle errors here
echo $e->getMessage();

所以我以这种方式创建了 phar,然后我就有了:

部署.php

<?php

require_once 'phar://package.phar/bootstrap.php';
$app->run();

但是当访问 /deploy.php 我得到:

[2015 年 5 月 15 日星期五 20:07:02] [错误] [客户端 10.0.2.2] PHP 警告: require_once(phar://package.phar/bootstrap.php) [function.require-once]: 失败 打开流:无法打开存档 “/vagrant/www/package.phar”,别名无效 /vagrant/www/deploy.php 在第 3 行 [2015 年 5 月 15 日星期五 20:07:02] [错误] [客户端 10.0.2.2] PHP 致命错误:require_once() [function.require]:需要打开失败 'phar://package.phar/bootstrap.php' (include_path='.:/usr/share/php:/usr/share/pear') 在 /vagrant/www/deploy.php 在第 3 行

你认为我应该这样解决它吗?

谢谢

【问题讨论】:

【参考方案1】:

编辑:

“在 Vagrant 盒子的共享文件夹中创建 phar 导致了这个问题。一旦我将“输出”属性更改为共享文件夹之外的位置,错误就消失了。” source


你应该检查你的 php.ini: phar.require_hash = Off

或者用setSignatureAlgorithm()签署你的Phar

或使用 Phing: &lt;pharpackage ... signature="sha512"&gt; ...

【讨论】:

嗨,设置 phar.require_hash = Off 但仍然给我同样的错误 好吧,你能在 [php.net/manual/en/phar.addfile.php](addFile()) 你的意思是这样的吗?:$phar-&gt;addFile($full_path . 'www/index.php', 'www/index.php'); ...,完成了,重建了phar,但仍然无法包含它,在这样做时得到invalid alias 错误:@ 987654330@ 我现在正在使用 Phing,所以似乎错误是 Phar 生成的旧方式已损坏,Phing 向我抛出:BUILD FAILED /vagrant/build.xml:16:9: Problem creating package: unable to copy stub of old phar to new phar "/vagrant/www/package.phar" [wrapped: unable to copy stub of old phar to new phar "/vagrant/www/package.phar"] 任何提示?谢谢! 我发现:“在 Vagrant 盒子的共享文件夹中创建 phar 会导致该问题。一旦我将“输出”属性更改为共享文件夹之外的位置,错误就消失了。”来源:github.com/box-project/box2/issues/90

以上是关于将整个 Slim 应用程序打包到 Phar 文件中时出错的主要内容,如果未能解决你的问题,请参考以下文章

php 构建Slim框架作为phar

简单了解Phar代码打包工具的使用

php php phar打包文件[php phar包装代码]

将Web应用程序(ZF2)转换为PHAR

PHP中phar包的使用

打包phar文件过大的问题。