Phar

添加笔记

用户贡献笔记 7 notes

dava
11 年前
这是一个防止用户下载 phar 归档文件的 apache2 htaccess 示例

RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]

它会触发一个“403 - 禁止”消息,而不是提供归档文件。
bohwaz
12 年前
如果您在尝试访问 phar 网页时遇到空白页,则您的 PHP 上可能启用了 Suhosin(例如在 Debian 和 Ubuntu 中),您需要将此添加到您的 php.ini 中以允许执行 PHAR 归档文件

suhosin.executor.include.whitelist="phar"
v-mafick at microsoft dot com
11 年前
用户应设置 `sys_temp_dir` 指令。

PHAR 将临时文件存储在 `sys_temp_dir` 或当前工作目录 (CWD) 中。

如果您当前的工作目录在远程文件系统上,这一点尤其重要。通常,Web 服务器集群将在每个 Web 服务器之间共享一个公共文件系统(使用 NFS、DFS 等)。在这种情况下,如果您没有将 `sys_temp_dir` 设置为本地目录,PHAR 将在网络上创建临时文件,这会导致性能和功能问题。
brunoczim
7 年前
这是一个使用 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);
}
lemonkid from OpenToAll
5 年前
通过 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');
?>
t dot habenreich at web dot de
10 年前
这是一个非常简单的类,用于从给定的源目录构建 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'
);
bawe_a at yahoo dot com
6 年前
<?php
include 'phar://ArPHP.phar/Arabic.php';
$obj = new I18N_Arabic('Numbers');

echo
$obj->int2str(1975);
?>
To Top