无法启用 phar 写入
Can't enable phar writing
我实际上是在 PHP 5.5.12 中使用 wamp 2.5,当我尝试创建一个 phar 文件时,returns 我收到以下消息:
Uncaught exception 'UnexpectedValueException' with message 'creating archive "..." disabled by the php.ini setting phar.readonly'
即使我在 php.ini.
中关闭 phar.readonly 选项
那么如何启用 phar 文件的创建?
出于安全原因,phar.readonly
只能在 php.ini
中禁用。
如果你想检查它是否真的没有使用 php.ini
以外的其他方法完成,那么在终端中输入:-
$ php -r "ini_set('phar.readonly',0);print(ini_get('phar.readonly'));"
如果它会给你 1
意味着 phar.readonly
是 On
.
More on phar.configuration
我遇到了同样的问题,并根据此线程上的信息拼凑而成,这是我在过度简化的解释中所做的:
- 在生成此错误的 PHP 代码中,我添加了
echo phpinfo();
(它显示了一个带有各种 PHP 信息的大 table)并在第一个几行验证 php.ini 文件的路径以确保您正在编辑正确的 php.ini.
- 找到
phpinfo()
table 上面写着 phar.readonly
的地方,注意它是 On.
- 打开步骤 1 中的 php.ini 文件并搜索
phar.readonly
。我的在第 995 行,上面写着 ;phar.readonly = On
- 将此行更改为
phar.readonly = Off
。确保行首没有分号。
- 重新启动服务器
- 确认您的 phar 项目现在按预期工作,and/or 再次搜索
phpinfo()table
以查看 phar.readonly 设置已更改。
需要在 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
保存
对于已更改 php.ini 文件但未看到任何更改的任何人。尝试使用该文件的 CLI 版本。对我来说,它在 /etc/php/7.4/cli/php.ini
使用 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 网络服务器调用
php -S localhost:8785 testphar.php
// Exception, phar is read only...
快速解决!
检查:
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
我实际上是在 PHP 5.5.12 中使用 wamp 2.5,当我尝试创建一个 phar 文件时,returns 我收到以下消息:
Uncaught exception 'UnexpectedValueException' with message 'creating archive "..." disabled by the php.ini setting phar.readonly'
即使我在 php.ini.
中关闭 phar.readonly 选项那么如何启用 phar 文件的创建?
phar.readonly
只能在 php.ini
中禁用。
如果你想检查它是否真的没有使用 php.ini
以外的其他方法完成,那么在终端中输入:-
$ php -r "ini_set('phar.readonly',0);print(ini_get('phar.readonly'));"
如果它会给你 1
意味着 phar.readonly
是 On
.
More on phar.configuration
我遇到了同样的问题,并根据此线程上的信息拼凑而成,这是我在过度简化的解释中所做的:
- 在生成此错误的 PHP 代码中,我添加了
echo phpinfo();
(它显示了一个带有各种 PHP 信息的大 table)并在第一个几行验证 php.ini 文件的路径以确保您正在编辑正确的 php.ini. - 找到
phpinfo()
table 上面写着phar.readonly
的地方,注意它是 On. - 打开步骤 1 中的 php.ini 文件并搜索
phar.readonly
。我的在第 995 行,上面写着;phar.readonly = On
- 将此行更改为
phar.readonly = Off
。确保行首没有分号。 - 重新启动服务器
- 确认您的 phar 项目现在按预期工作,and/or 再次搜索
phpinfo()table
以查看 phar.readonly 设置已更改。
需要在 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
保存
对于已更改 php.ini 文件但未看到任何更改的任何人。尝试使用该文件的 CLI 版本。对我来说,它在 /etc/php/7.4/cli/php.ini
使用 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 网络服务器调用
php -S localhost:8785 testphar.php
// Exception, phar is read only...
快速解决!
检查:
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