这是一个防止用户下载 phar 归档文件的 apache2 htaccess 示例
RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]
它会触发一个“403 - 禁止”消息,而不是提供归档文件。
这是一个防止用户下载 phar 归档文件的 apache2 htaccess 示例
RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]
它会触发一个“403 - 禁止”消息,而不是提供归档文件。
如果您在尝试访问 phar 网页时遇到空白页,则您的 PHP 上可能启用了 Suhosin(例如在 Debian 和 Ubuntu 中),您需要将此添加到您的 php.ini 中以允许执行 PHAR 归档文件
suhosin.executor.include.whitelist="phar"
用户应设置 `sys_temp_dir` 指令。
PHAR 将临时文件存储在 `sys_temp_dir` 或当前工作目录 (CWD) 中。
如果您当前的工作目录在远程文件系统上,这一点尤其重要。通常,Web 服务器集群将在每个 Web 服务器之间共享一个公共文件系统(使用 NFS、DFS 等)。在这种情况下,如果您没有将 `sys_temp_dir` 设置为本地目录,PHAR 将在网络上创建临时文件,这会导致性能和功能问题。
这是一个使用 CLI 创建 phar 文件的非常简单的程序。请注意,它需要在 php.ini 中将 phar.readonly 设置为 false(关闭)。
<?php
$filename = "default";
$dir = "./";
$regex = "/^(?!.*build\\.php)(?:.*)$/";
$main = "main.php";
$shebang = "#!/usr/bin/env php";
$chmod = true;
for ($i = 0; $i < $argc; $i++) {
switch ($argv[$i]) {
case "-o":
$i++;
if ($i >= $argc) {
echo "缺少输出文件名" . PHP_EOL;
exit(1);
}
$filename = $argv[$i];
break;
case "-i":
$i++;
if ($i >= $argc) {
echo "缺少输入目录名" . PHP_EOL;
exit(1);
}
$dir = $argv[$i];
break;
case "-p":
$i++;
if ($i >= $argc) {
echo "缺少正则表达式模式" . PHP_EOL;
exit(1);
}
$regex = $argv[$i];
break;
case "-m":
$i++;
if ($i >= $argc) {
echo "缺少主文件" . PHP_EOL;
exit(1);
}
$main = $argv[$i];
break;
case "-b":
$i++;
if ($i >= $argc) {
echo "缺少文件的 shebang" . PHP_EOL;
exit(1);
}
$shebang = $argv[$i];
break;
case "--no-chmod":
$chmod = false;
break;
}
}
if (file_exists($filename)) unlink($filename);
$phar = new Phar($filename);
$phar->buildFromDirectory($dir, $regex);
$phar->setStub(($shebang ? $shebang . PHP_EOL : "") . $phar->createDefaultStub($main));
if ($chmod) {
chmod($filename, fileperms($phar) | 0700);
}
通过 phar:// 读取时,流将反序列化对象,包括 phar 文件
使用此方法创建 phar
<?php
// 创建新的 Phar
$phar = new Phar('lemon.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');
// 将任何类的对象添加为元数据
class AnyClass {}
$object = new AnyClass;
$object->data = 'Chanh';
$phar->setMetadata($object);
$phar->stopBuffering();
?>
并通过以下方式读取它
<?php
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// 输出:Chanh
file_get_contents('phar://test.phar');
?>
这是一个非常简单的类,用于从给定的源目录构建 phar 文件。您可以将其用于您自己的项目和简单的部署。
但我主要的目标是展示如何以简单的方式使用 PHAR 函数。
<?php
class BuildPhar
{
private $_sourceDirectory = null;
private $_stubFile = null;
private $_outputDirectory = null;
private $_pharFileName = null;
/**
* @param $_sourceDirectory // 这是存储项目的目录。
* @param $stubFile // 为您的 phar 文件命名入口点。此文件必须位于源代码中
* 目录。
* @param null $_outputDirectory // 将 phar 文件放置到的目录。
* @param string $pharFileName // 您最终的 *.phar 文件的名称。
*/
public function __construct($_sourceDirectory, $stubFile, $_outputDirectory = null, $pharFileName = 'myPhar.phar') {
if ((file_exists($_sourceDirectory) === false) || (is_dir($_sourceDirectory) === false)) {
throw new Exception('未提供有效的源目录。');
}
$this->_sourceDirectory = $_sourceDirectory;
if (file_exists($this->_sourceDirectory.'/'.$stubFile) === false) {
throw new Exception('您提供的存根文件不存在。');
}
$this->_stubFile = $stubFile;
if(empty($pharFileName) === true) {
throw new Exception('您提供的 phar 文件的输出名称为空。');
}
$this->_pharFileName = $pharFileName;
if ((empty($_outputDirectory) === true) || (file_exists($_outputDirectory) === false) || (is_dir($_outputDirectory) === false)) {
if ($_outputDirectory !== null) {
trigger_error ( '您的输出目录无效。我们将其回退到:"'.dirname(__FILE__).'".', E_USER_WARNING);
}
$this->_outputDirectory = dirname(__FILE__);
} else {
$this->_outputDirectory = $_outputDirectory;
}
$this->prepareBuildDirectory();
$this->buildPhar();
}
private function prepareBuildDirectory() {
if (preg_match('/.phar$/', $this->_pharFileName) == FALSE) {
$this->_pharFileName .= '.phar';
}
if (file_exists($this->_pharFileName) === true) {
unlink($this->_pharFileName);
}
}
private function buildPhar() {
$phar = new Phar($this->_outputDirectory.'/'.$this->_pharFileName);
$phar->buildFromDirectory($this->_sourceDirectory);
$phar->setDefaultStub($this->_stubFile);
}
}
//END Class
//示例用法:
$builder = new BuildPhar(
dirname(__FILE__).'/_source',
'my_default_stub.php',
dirname(__FILE__).'/_output',
'my-phar-file.phar'
);
<?php
include 'phar://ArPHP.phar/Arabic.php';
$obj = new I18N_Arabic('Numbers');
echo $obj->int2str(1975);
?>