打包PHP应用程序

问题描述 投票:4回答:5

我正在尝试从Web应用程序中创建一个.phar文件。在php documentation's example之后,我为此尝试了以下方法。

<?php
$srcRoot = __DIR__ . "/../app";
$buildRoot = __DIR__ . "/../build";
$p = new Phar("$buildRoot/build.phar", 0, 'build.phar');
$p->buildFromIterator(
    new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($srcRoot)
    ),
    $srcRoot
);

但是我收到以下错误。我对此错误一无所知。代码有什么问题?

PHP Fatal error:  Uncaught exception 'UnexpectedValueException' with message
'Iterator RecursiveIteratorIterator returned a path "D:\site\app" that is
 not in the base directory "D:\site\app"'
in D:\site\tools\create-phar.php:7
php deployment build phar
5个回答
6
投票

问题的根源是RecursiveDirectoryIterator还列出了点文件-RecursiveDirectoryIterator.。遍历..时,它还会列出/path/to/foo/path/to/foo/.,它们转到父目录-基本目录之外。

因此,您必须防止包含“ ..”文件,这是最容易实现的,使用/path/to/foo/..作为DirectoryIterator的第二个参数:

FilesystemIterator::SKIP_DOTS

2
投票

((@ cweiske-我刚刚意识到您对我很满意,我将确保下次再次刷新页面,由衷的歉意!)

您只需稍作修改即可跳过Unix路径/。和/ ..:

FilesystemIterator::SKIP_DOTS

0
投票

new RecursiveDirectoryIterator($srcRoot, FilesystemIterator::SKIP_DOTS) 使从源文件创建PHAR存档变得非常容易。基本上,您首先要添加一个配置文件,然后只需在命令行中调用<?php $srcRoot = __DIR__ . "/../app"; $buildRoot = __DIR__ . "/../build"; $p = new Phar("$buildRoot/build.phar", 0, 'build.phar'); $p->buildFromIterator( new RecursiveIteratorIterator( new RecursiveDirectoryIterator($srcRoot, FilesystemIterator::SKIP_DOTS) ), $srcRoot ); 即可创建PHAR文件。

[Matthieu Moquet的Box描述了他如何使用Box简化PHP Cli应用程序的分发。就个人而言,我也一直在将Box用于CLI应用程序,但是官方项目说明不限于CLI应用程序,而是将Box项目总结为:

用于构建和管理Phars的应用程序。

Box项目提供PHAR构建脚本并负责正确设置所有路径,因此这可以解决您的问题。


0
投票

box build提出的解决方案很棒。但是,在某些情况下,您可能需要能够添加更多目录路径排除项。看一下使用great blog post排除所有对@cweiske目录的引用的示例:

.git

-1
投票

查看php.ini文件,检查phar.readonly字段的值。创建phar存档必须为0。

参考:FilterIterator

© www.soinside.com 2019 - 2024. All rights reserved.