标签: phar

从.phar存档中提取文件

对于phar文件,我完全错过了一些东西.我正在安装一个需要phpunit,pdepend和其他依赖项的项目.我把它们作为.phar文件获取.但是,我无法使用命令行工具(php命令)从中提取文件.我搜索了问题,我发现没有什么能真正回答这个问题.有人可以帮忙吗?

php phar

48
推荐指数
5
解决办法
6万
查看次数

如何在HostGator上使用PHP Composer

我最近决定在Zend Framework 2中启动一个项目,并且无法在HostGator共享服务器上运行它.

默认情况下,HostGator的共享服务器在PHP 5.2.2中运行,如果您上传ZF2 Skeleton应用程序,它将无法开箱即用.

此外,如果您碰巧具有对HG共享帐户的SSH访问权限(通常必须请求它),您将无法运行.PHAR文件,因为PHP的CLI版本也是5.2.2.

幸运的是,我得到了它的工作......见下文.

php phar php-5.2 zend-framework2 composer-php

28
推荐指数
2
解决办法
1万
查看次数

为简单的应用程序生成PHAR

我正在尝试使用Symfony2控制台库构建CLI工具.我有一些基本的工作,现在我想把它打包成一个phar.我已经阅读了一些例子,但我看到的那些非常简单(3个文件,没有命名空间等).

在我的src/目录中,我有以下内容:

在此输入图像描述

上面src/我有一个console.php我执行运行应用程序.我也有一个vendors/目录,因为我正在使用composer来安装依赖项.console.php很简单:

#!/usr/bin/env php
<?php

set_time_limit(0);
$loader = require 'vendor/autoload.php';

use Symfony\Component\Console\Application;
use Bendihossan\Pinfo\Command\EnvironmentCommand;
use Bendihossan\Pinfo\Command\ExtensionsCommand;
use Bendihossan\Pinfo\Command\RunAllCommand;

$console = new Application();

$console->add(new RunAllCommand());
$console->add(new EnvironmentCommand);
$console->add(new ExtensionsCommand);

$console->run();
Run Code Online (Sandbox Code Playgroud)

从我对构建一个phar的理解(我很少)我认为我需要将其console.php作为存根和其他所有内容src/添加到我的所有依赖项中vendors/.

查看phpmaster.com上的示例代码,他们手动指定每个文件包含在phar中使用file_get_contents,但是我需要维护我的目录结构才能使用composer的自动加载器并保持PSR-0目录结构.

有没有一种简单的方法来创建.phar并在其中维护我的目录结构,所以我仍然可以使用composer的自动加载器?

php packaging phar composer-php symfony-components

24
推荐指数
1
解决办法
1万
查看次数

PHP:找不到类'Phar'

我尝试使用Silex框架作为我的Web应用程序的基础.但是,如果我尝试包含*.phar存档,PHP会引发以下错误:

Fatal error: Class 'Phar' not found in /var/www/framework/silex.phar on line 11
Run Code Online (Sandbox Code Playgroud)

以下相关内容在我的内容中/etc/php/php.ini(如Silex文档中所述):

extension=phar.so
phar.readonly = Off
phar.require_hash = Off
detect_unicode = Off
Run Code Online (Sandbox Code Playgroud)

存在PHAR库,/usr/lib/php/modules/phar.so其中设置为我的所有库的扩展路径php.ini

有谁知道为什么PHP会抛出这个错误?

php phar

23
推荐指数
2
解决办法
5万
查看次数

PHP Phar在功能强大的PC上创建速度慢,如何加速(加载/读取~3000个文件)?

我正在尝试使用Phar打包我的Web应用程序(Symfony 2项目).我成功地在一个合理的时间内(1-2分钟)打包了一个带有数百个文件的微框架Silex.

问题在于我的开发机器(i7 4770k,16GB,SSD Raid 0,RAM磁盘上的项目)创建存档非常慢,每个文件需要大约1秒.我真的需要找到一种方法来加快速度.

单次迭代读取/加载文件很慢.我正在使用以下方法添加文件:

function addFile(Phar $phar, SplFileInfo $file)
{
    $root = realpath(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);
    $path = strtr(str_replace($root, '', $file->getRealPath()), '\\', '/');
    $phar->addFromString($path, file_get_contents($file));
}

$phar = new Phar(/* ... */);
$phar->startBuffering();

// ...    
foreach ($files as $file) {
    addFile($phar, $file);
}

// ...
$phar->setStub(/* ... */);
$phar->stopBuffering();
Run Code Online (Sandbox Code Playgroud)

如何加快阅读/添加文件的速度?可能是我的操作系统(Windows)的问题?

编辑:禁用缓冲并没有解决问题.从字符串添加相同的速度:

// This is VERY fast (~ 1 sec to read all 3000+ files)
$strings = array();
foreach ($files as $file) {
    $root = realpath(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);
    $path = …
Run Code Online (Sandbox Code Playgroud)

php performance phar symfony

23
推荐指数
2
解决办法
1480
查看次数

请解释如何创建PHP的Phar存根

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

# php myProject.phar
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的:

我的项目

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

 |-- createPhar.php
 `-- bootstrap.php
Run Code Online (Sandbox Code Playgroud)

bootstrap.php中

bootstrap.php文件包含:

<?php
print phpversion() . PHP_EOL;
print 'i am some script' . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

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

# cd MyProject 
# php bootstrap.php
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

5.3.2-1ubuntu4.9
i am some script
Run Code Online (Sandbox Code Playgroud)

createPhar.php

createPhar.php文件旨在将项目转换为Phar存档.它看起来像这样:

<?php    
$phar = new Phar('MyProject.phar');
$phar->addFile('bootstrap.php');
$phar->setStub( $phar->createDefaultStub('bootstrap.php') );
Run Code Online (Sandbox Code Playgroud)

当我运行该脚本时......

# php createPhar.php
Run Code Online (Sandbox Code Playgroud)

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

|-- bootstrap.php
|-- createPhar.php
`-- MyProject.phar
Run Code Online (Sandbox Code Playgroud)

现在这是问题所在

当我运行phar文件时......

# php MyProject.phar 
Run Code Online (Sandbox Code Playgroud)

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

相反,我什么都看不见 完全没有输出.这意味着我的bootstrap.php …

php stub phar

18
推荐指数
1
解决办法
4281
查看次数

如何从内置的PHP 5.4 webserver运行webphar PHP文件?

按照标题,我创建了一个非常简单的测试工具.我想用内置的webserver(PHP 5.4)测试它,但似乎不可能.

php -S localhost:80 /path/to/myphar.php
Run Code Online (Sandbox Code Playgroud)

结果:空白页面(在phar前端控制器中index.php正在进行一些HTML输出).

php -S localhost:80 -t /path/to/folder_with_index_and_phar
Run Code Online (Sandbox Code Playgroud)

使用加载器脚本:

<?php

require 'phar://myphar.php'
Run Code Online (Sandbox Code Playgroud)

再次生成一个空白页面.

这甚至是可能的还是我必须使用Apache?

编辑:一年后我再次需要这个.这是正在发生的事情(来自答案):

php -S localhost:80 -t /path/to/app.phar
php -S localhost:80 -t /path/to/app.phar
Run Code Online (Sandbox Code Playgroud)

导致错误:/ path/to/app.phar不是目录.

而:

php -S localhost:80 -t .
http://localost/app.phar/foo/bar
Run Code Online (Sandbox Code Playgroud)

工作,但我不需要app.phar "前缀"!

使用Apache并将目录索引设置为app.phar按预期工作.

php phar php-5.4

16
推荐指数
3
解决办法
1901
查看次数

PHP中PHAR档案的优点

PHP 5.3有一个名为PHAR的新功能,类似于JAVA中的JAR.它基本上是PHP文件的存档.它的优点是什么?我无法理解他们如何在Web场景中提供帮助.

除"易于部署"之外的任何其他用途 - 仅通过复制一个文件来部署整个应用程序

php phar

13
推荐指数
3
解决办法
4639
查看次数

如何将phar文件放在phar文件中?

我想将一个phar文件放在一个phar文件中.我最直接地尝试过:

$p = new Phar('test.phar', null, 'self.phar');
$p->setStub('<?php Phar::mapPhar();
include \'phar://self.phar/index.php\'; __HALT_COMPILER(); ?>');
$p['index.php'] = '<?php
echo "hello world\n";';

$p = new Phar('test2.phar', null, 'self.phar');
$p->setStub('<?php Phar::mapPhar();
include \'phar://self.phar/index.php\'; __HALT_COMPILER(); ?>');
$p['index.php'] = '<?php
echo "hello phar world\n";';
$p['test.phar'] = file_get_contents('test.phar');
Run Code Online (Sandbox Code Playgroud)

但是PHP只是不想打开它.它不接受以下任何一项包括:

// Warning: Phar::mapPhar(phar://path/to/test2.phar/test.phar): failed to open
// stream: Invalid argument in phar://path/to/test2.phar/test.phar
include('phar://test2.phar/test.phar');

// Warning: include(phar://test2.phar/test.phar/index.php): failed to open
// stream: phar error: "test.phar/index.php" is not a file in phar "test2.phar"
include('phar://test2.phar/test.phar/index.php');

// Warning: include(phar://test2.phar/phar://test.phar/index.php): failed to
// …
Run Code Online (Sandbox Code Playgroud)

php phar

13
推荐指数
1
解决办法
1430
查看次数

使用phar Stream写入PharData文件

当我尝试这个:

$phar = new PharData('./phar.tar', 0, null, Phar::TAR);
$phar->addEmptyDir('test');

file_put_contents('phar://./phar.tar/test/foo.txt', 'bar');
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

警告:file_put_contents(phar://./phar.tar/test/foo.txt):无法打开流:无法创建phar'./ phar.tar',文件扩展名(或组合)无法识别或目录不存在

我可以使用file_get_contents但不应该使用file_put_contents吗?


为了让事情更加怪异,我尝试了@hakre在他的评论中提出的想法并且它有效!

$phar = new PharData('./phar.tar', 0, null, Phar::TAR);
$phar->addEmptyDir('test');

if (file_exists('./phar.phar') !== true)
{
    symlink('./phar.tar', './phar.phar');
}

file_put_contents('phar://./phar.phar/test/foo.txt', 'bar');
var_dump(file_get_contents('phar://./phar.tar/test/foo.txt')); // string(3) "bar"
Run Code Online (Sandbox Code Playgroud)

php stream phar

13
推荐指数
2
解决办法
3579
查看次数