无法启用 Phar 写入

Posted

技术标签:

【中文标题】无法启用 Phar 写入【英文标题】:Can't enable phar writing 【发布时间】:2016-04-12 13:53:18 【问题描述】:

我实际上是在 php 5.5.12 中使用 wamp 2.5,当我尝试创建 phar 文件时,它会返回以下消息:

未捕获的异常“UnexpectedValueException”和消息“正在创建存档“...”被 php.ini 设置 phar.readonly 禁用”

即使我关闭 php.ini 中的 phar.readonly 选项。

那么如何才能创建 phar 文件呢?

【问题讨论】:

确保您正在编辑正确的 php.ini。可以使用phpinfo()找到加载的php.ini 你说得对,我觉得我发的太快了。我实际上是在编辑错误的 php.ini 文件。 我在运行 PHP 版本 5.5.9-1ubuntu4.14 时遇到了完全相同的问题,但是,我已经验证我正在编辑 phpinfo() 中定义的正确 php.ini,在我的如果是/etc/php5/apache2/php.ini 并且该行显示为phar.readonly = Off 还有什么需要启用的吗? 在命令行执行的脚本中,必须编辑文件夹cli的文件,例如:/etc/php5/cli/php.ini 您好,@user3292788 如果以下任何一个答案已经解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。 【参考方案1】:

快速解决方案!

检查:

cat /etc/php/7.4/apache2/php.ini | grep phar.readonly

修复:

sed -i 's/;phar.readonly = On/;phar.readonly = Off/g' /etc/php/7.4/apache2/php.ini

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

使用 php-cli 和 hashbang,我们可以即时设置它而不会弄乱 ini 文件。


testphar.php

#!/usr/bin/php -d phar.readonly=0
<?php
print(ini_get('phar.readonly')); // Must return 0
// make sure it doesn't exist
@unlink('brandnewphar.phar');
try 
    $p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
 catch (Exception $e) 
    echo 'Could not create phar:', $e;

echo 'The new phar has ' . $p->count() . " entries\n";
$p->startBuffering();
$p['file.txt'] = 'hi';
$p['file2.txt'] = 'there';
$p['file2.txt']->compress(Phar::GZ);
$p['file3.txt'] = 'babyface';
$p['file3.txt']->setMetadata(42);
$p->setStub('<?php
function __autoload($class)

    include "phar://myphar.phar/" . str_replace("_", "/", $class) . ".php";

Phar::mapPhar("myphar.phar");
include "phar://myphar.phar/startup.php";
__HALT_COMPILER();');
$p->stopBuffering();

// Test
$m = file_get_contents("phar://brandnewphar.phar/file2.txt");
$m = explode("\n",$m);
var_dump($m);
/* Output:
* there
**/

✓ 必须设置为可执行:

chmod +x testphar.php

✓ 必须这样调用

./testphar.php
// OUTPUT there

⚠️不能这样称呼:

php testphar.php
// Exception, phar is read only...

⚠️ 无法从 CGI Web 服务器调用

php -S localhost:8785 testphar.php 
// Exception, phar is read only...

【讨论】:

【参考方案3】:

对于更改了 php.ini 文件但没有看到任何更改的任何人。尝试使用该文件的 CLI 版本。对我来说,它在/etc/php/7.4/cli/php.ini

【讨论】:

【参考方案4】:

我遇到了同样的问题,并从这个线程上的信息拼凑起来,这是我在过度简化的解释中所做的:

    在产生此错误的 PHP 代码中,我添加了echo phpinfo();(它显示了一个包含各种 PHP 信息的大表),并在前几行中验证了 php.ini 文件的路径,以确保您“重新编辑正确的 php.ini。 在phpinfo() 表上找到phar.readonly 并注意它是开启。 打开步骤 1 中的 php.ini 文件并搜索 phar.readonly。我的在第 995 行,上面写着;phar.readonly = On 将此行更改为phar.readonly = Off。确保行首没有分号。 重启你的服务器 确认您的 phar 项目现在正在按预期工作,和/或再次搜索 phpinfo()table 以查看 phar.readonly 设置已更改。

【讨论】:

在 Linux 上使用:php -i | grep phar.readonly 来验证它是否打开。和php -i | grep "Loaded Configuration" 查找当前配置。然后sudo nano thefile,CTRL+W phar.readonly(回车)。换行并用 CTRL+X, Y, (enter) 保存【参考方案5】:

需要在php.ini文件中禁用

输入which php 根据机器给出不同的输出,例如 /c/Apps/php/php-7.2.11/php 然后打开给定的路径不是php文件。

例如/c/Apps/php/php-7.2.11

编辑 php.ini 文件 可以的

vi C:\Apps\php\php-7.2.11\php.ini

code C:\Apps\php\php-7.2.11\php.ini

[Phar]
; http://php.net/phar.readonly
phar.readonly = Off

; http://php.net/phar.require-hash
phar.require_hash = Off

保存

【讨论】:

【参考方案6】:

出于安全原因,phar.readonly 只能在php.ini 中禁用。 如果您想检查它是否真的没有使用php.ini 以外的其他方法完成,那么在终端中输入:-

$ php -r "ini_set('phar.readonly',0);print(ini_get('phar.readonly'));" 

如果它会给你1 意味着phar.readonlyOn。More on phar.configuration

【讨论】:

以上是关于无法启用 Phar 写入的主要内容,如果未能解决你的问题,请参考以下文章

Phar 无法提取文件

电脑无法正常安装程序出现无法打开要写入的文件

无法打开输入文件:composer.phar

PHP 可执行文件无法处理 composer.phar

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

file_get_contents(phar://../storage/logs/laravel.log/test.txt):无法打开流:phar 内部损坏