对于phar文件,我完全错过了一些东西.我正在安装一个需要phpunit,pdepend和其他依赖项的项目.我把它们作为.phar文件获取.但是,我无法使用命令行工具(php命令)从中提取文件.我搜索了问题,我发现没有什么能真正回答这个问题.有人可以帮忙吗?
我最近决定在Zend Framework 2中启动一个项目,并且无法在HostGator共享服务器上运行它.
默认情况下,HostGator的共享服务器在PHP 5.2.2中运行,如果您上传ZF2 Skeleton应用程序,它将无法开箱即用.
此外,如果您碰巧具有对HG共享帐户的SSH访问权限(通常必须请求它),您将无法运行.PHAR文件,因为PHP的CLI版本也是5.2.2.
幸运的是,我得到了它的工作......见下文.
我正在尝试使用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的自动加载器?
我尝试使用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会抛出这个错误?
我正在尝试使用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 CLI应用程序,可以从命令行作为phar文件运行:
# php myProject.phar
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所尝试的:
我的项目位于一个名为的目录中MyProject,它包含以下两个文件:
|-- createPhar.php
`-- bootstrap.php
Run Code Online (Sandbox Code Playgroud)
该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文件旨在将项目转换为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 …
按照标题,我创建了一个非常简单的测试工具.我想用内置的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 5.3有一个名为PHAR的新功能,类似于JAVA中的JAR.它基本上是PHP文件的存档.它的优点是什么?我无法理解他们如何在Web场景中提供帮助.
除"易于部署"之外的任何其他用途 - 仅通过复制一个文件来部署整个应用程序
我想将一个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) 当我尝试这个:
$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) phar ×10
php ×10
composer-php ×2
packaging ×1
performance ×1
php-5.2 ×1
php-5.4 ×1
stream ×1
stub ×1
symfony ×1