无法启用phar写入

问题描述 投票:0回答:7

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

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

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

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

phar php-ini
7个回答
15
投票

我遇到了同样的问题,并根据该线程上的信息拼凑而成,这是我在过度简化的解释中所做的:

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

5
投票
由于安全原因,

phar.readonly
只能在
php.ini
中禁用。 如果您想检查是否确实没有使用
php.ini
以外的其他方法完成,请在终端中输入以下内容:-

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

如果它会给你

1
意味着
phar.readonly
On

有关 phar.configuration 的更多信息


3
投票

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

这也是推荐的方式:

注:

出于安全原因,此设置只能在 php.ini 中取消设置。如果 phar.readonly 在 php.ini 中被禁用,用户可以启用 phar.readonly 在脚本中或稍后禁用它。如果 phar.readonly 是 在 php.ini 中启用,脚本可能无害地“重新启用”INI 变量,但可能无法禁用它。 https://www.php.net/manual/en/phar.configuration.php


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
// We can even remove the extension!
./testphar

⚠️不能这样称呼:

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

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

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

2
投票

需要在

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

保存


1
投票

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

/etc/php/7.4/cli/php.ini


0
投票

快速解决方案!

检查:

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

0
投票

运行 php 时,您可以使用

-d
标志指定要在 cli 中定义的标志。

所以你可以这样运行你的php:

php -d phar.readonly=0 ./your-script

然而,记住或指定这非常烦人,所以我想出了这个:

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

if (ini_get('phar.readonly')) {
    exit(proc_close(proc_open(
        'php -d phar.readonly=0 ' . implode(' ', array_map('escapeshellarg', $argv)),
        [STDIN, STDOUT, STDERR],
        /*&*/ $pipes
    )));
}

// Do whatever phar writable actions you need

如果您关闭了只读,那么它就会继续。如果您打开了它,它将在关闭时再次执行脚本。

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