Here is an apache2 htaccess example that prevents the downloading of phar-Archives by the user:
RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]
It triggers a "403 - Forbidden" message instead of delivering the archive.за да работи за
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
за да работи за
Референца за `book.phar.php` со подобрена типографија и навигација.
за да работи за
Вовед
Екстензијата phar обезбедува начин да се стават цели PHP апликации во една датотека наречена "phar" (PHP Архива) за лесна дистрибуција и инсталација. Покрај обезбедувањето на оваа услуга, екстензијата phar исто така обезбедува метод за апстракција на формат на датотека за креирање и манипулирање со tar и zip датотеки преку PharData класа, исто како што PDO обезбедува унифициран интерфејс за пристап до различни бази на податоци. За разлика од PDO, кој не може да конвертира помеѓу различни бази на податоци, Phar исто така може да конвертира помеѓу tar, zip и phar формати на датотеки со еден ред код. види се фрла ако параметарот е непознат спецификатор на формат на датотека. за еден пример.
Што е phar? Phar архивите се најдобро карактеризирани како удобен начин за групирање на неколку датотеки во една датотека. Како таква, phar архива обезбедува начин за дистрибуција на комплетна PHP апликација во една датотека и нејзино извршување од таа датотека без потреба од нејзино извлекување на диск. Дополнително, phar архивите можат да се извршуваат од PHP исто лесно како и секоја друга датотека, како на командната линија, така и од веб сервер. Phar е некако како USB флеш диск за PHP апликации.
Phar ја имплементира оваа функционалност преку Stream Wrapper. Нормално, за да користите надворешна датотека во PHP скрипта, би користеле include:
Пример #1 Користење на надворешна датотека
<?php
include '/path/to/external/file.php';
?>
PHP може да се замисли како всушност преведување
/path/to/external/file.php во stream wrapper како file:///path/to/external/file.php, а под хаубата всушност ги користи обичните file stream wrapper функции за пристап до сите локални датотеки.
За да користите датотека наречена file.php содржана во phar архива
/path/to/myphar.phar, синтаксата е многу слична на file:// синтаксата погоре.
Пример #2 Користење на датотека во phar архива
<?php
include 'phar:///path/to/myphar.phar/file.php';
?>Всушност, може да се третира phar архива како да е надворешен диск, користејќи било кој од fopen()-поврзаните функции, opendir() and mkdir()-поврзаните функции за читање, менување или креирање нови датотеки и директориуми во phar архивата. Ова овозможува комплетни PHP апликации да се дистрибуираат во една датотека и да се извршуваат директно од таа датотека.
Најчестата употреба за phar архива е дистрибуирање на комплетна апликација во една датотека. На пример, PEAR Инсталаторот што е вклучен со PHP верзиите се дистрибуира како phar архива. За да се користи phar архива дистрибуирана на овој начин, архивата може да се изврши на командната линија или преку веб сервер.
Најчестата употреба за phar архива е дистрибуирање на комплетна апликација во една датотека. На пример, PEAR Installer кој е вклучен со PHP верзиите се дистрибуира како phar архива. За да се користи phar архива дистрибуирана на овој начин, архивата може да се изврши од командната линија или преку веб сервер. tar Phar архивите може да се дистрибуираат како
zip архиви, phar архиви, или како прилагоден
формат на датотека дизајниран специјално за phar екстензијата. Секој формат на датотека има предности и недостатоци. Форматите на датотеки tar и zip може да се читаат или екстрахираат од било која алатка од трета страна што може да го прочита форматот, но бараат phar екстензија за да работат со PHP. Форматот на датотека phar е прилагоден и уникатен за phar екстензијата, и може да биде креиран само од phar екстензијата или PEAR пакетот» PHP_Archive
, но има предност што апликациите креирани во овој формат ќе работат дури и ако phar екстензијата не е овозможена.
Со други зборови, дури и со оневозможена phar екстензија, може да се изврши или вклучи архива базирана на phar. Пристапот до индивидуални датотеки во phar архива е возможен само со phar екстензија, освен ако phar архивата не е креирана од PHP_Archive.
Phar екстензијата е исто така способна да конвертира phar архива од tar во zip или во phar формат на датотека во една команда:
<?php
$phar = new Phar('myphar.phar');
$pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // makes myphar.phar.tar.gz
?>Пример #3 Конвертирање на phar архива од phar во tar формат на датотека gzip Phar може да компресира индивидуални датотеки или цела архива користејќи bzip2 компресија или
компресија, и може автоматски да ја провери интегритетот на архивата преку употреба на MD5, SHA-1, SHA-256 или SHA-512 потписи.
phar.readonly Конечно, Phar екстензијата е свесна за безбедноста и по дифолт го оневозможува пристапот за запишување на извршни phar архиви, и бара системско оневозможување на PharData class.
php.ini поставката за да се креираат или модифицираат phar архиви. Нормални tar и zip архиви без извршен „stub“ секогаш може да се креираат или модифицираат користејќи Ако креирате апликации за дистрибуција, ќе сакате да го прочитатеКако да креирате Phar Архива . Ако сакате повеќе информации за разликите помеѓу трите формати на датотеки што ги поддржува phar, треба да го прочитате.
Phar, Tar и Zip Како да користите Phar архиви.
Зборот phar е споен збор од PHP and
Archive и е базиран лабаво на jar (Java Archive) познат на Java програмерите.
Имплементацијата за Phar архивите е базирана на PEAR пакетот формат на датотека дизајниран специјално за phar екстензијата. Секој формат на датотека има предности и недостатоци. Форматите на датотеки tar и zip може да се читаат или екстрахираат од било која алатка од трета страна што може да го прочита форматот, но бараат phar екстензија за да работат со PHP. Форматот на датотека phar е прилагоден и уникатен за phar екстензијата, и може да биде креиран само од phar екстензијата или PEAR пакетот, а деталите за имплементацијата се слични, иако Phar екстензијата е многу помоќна. Дополнително, Phar екстензијата дозволува повеќето PHP апликации да се стартуваат непроменети додека phar архивите базирани на PHP_Archive честопати бараат големи модификации за да работат.
- Installing/Configuring
- Претходно дефинирани константи
- Користење на Phar архиви
- Креирање на Phar архиви
- Што прави еден phar да биде phar, а не tar или zip?
- за да работи за — Класата Phar
- Phar::addEmptyDir — Додај празна директориум во phar архивата
- Phar::addFile — Додај датотека од датотечниот систем во phar архивата
- Phar::addFromString — Додај датотека од стринг во phar архивата
- Phar::apiVersion — Враќа верзија на API
- Phar::buildFromDirectory — Конструирај phar архива од датотеките во директориум
- Phar::buildFromIterator — Конструирај phar архива од итератор
- Phar::canCompress — Враќа дали phar екстензијата поддржува компресија со zlib или bzip2
- Phar::canWrite — Враќа дали phar екстензијата поддржува пишување и креирање phars
- Phar::compress — Компресирај ја целата Phar архива користејќи Gzip или Bzip2 компресија
- Phar::compressFiles — Компресирај ги сите датотеки во тековната Phar архива
- Phar::__construct — Конструирај Phar архива објект
- Phar::convertToData — Конвертирај phar архива во не-извршна tar или zip датотека
- Phar::convertToExecutable — Конвертирај phar архива во друг извршен phar архива формат на датотека
- Phar::copy — Копирај датотека внатре во phar архивата во друга нова датотека во рамките на phar
- Phar::count — Враќа број на записи (датотеки) во Phar архивата
- Phar::createDefaultStub — Креирај специфичен stub за phar-датотечен формат
- Phar::decompress — Декомпресирај ја целата Phar архива
- Phar::decompressFiles — Декомпресирај ги сите датотеки во тековната Phar архива
- Phar::delMetadata — Избриши ги глобалните метаподатоци на phar
- Phar::delete — Избриши датотека во phar архивата
- Phar::__destruct — Уништува објект Phar архива
- Phar::extractTo — Извлечете ја содржината на phar архива во директориум
- Phar::getAlias — Земете го алијасот за Phar
- Phar::getMetadata — Враќа метаподатоци од phar архива
- Phar::getModified — Вратете дали phar е изменет
- Phar::getPath — Земете ја вистинската патека до Phar архивата на дискот
- Phar::getSignature — Вратете MD5/SHA1/SHA256/SHA512/OpenSSL потпис на Phar архива
- Phar::getStub — Вратете го PHP лоадерот или bootstrap стилот на Phar архива
- Phar::getSupportedCompression — Вратете низа од поддржани алгоритми за компресија
- Phar::getSupportedSignatures — Вратете низа од поддржани типови на потписи
- Phar::getVersion — Вратете информации за верзијата на Phar архивата
- Phar::hasMetadata — Враќа дали phar има глобални метаподатоци
- Phar::interceptFileFuncs — Инструктира phar да пресретнува fopen, file_get_contents, opendir и сите функции поврзани со статистиката
- Phar::isBuffering — Се користи за да се утврди дали операциите за пишување на Phar се баферирани или се запишуваат директно на дискот
- Phar::isCompressed — Враќа Phar::GZ или PHAR::BZ2 ако целата phar архива е компресирана (.tar.gz/tar.bz и слично)
- Phar::isFileFormat — Враќа точно ако phar архивата е базирана на tar/phar/zip формат на датотека во зависност од параметарот
- Phar::isValidPharFilename — Враќа дали даденото име на датотека е валидно име на phar датотека
- Phar::isWritable — Враќа точно ако phar архивата може да се менува
- Phar::loadPhar — Вчитува која било phar архива со алијас
- Phar::mapPhar — Чита моментално извршена датотека (phar) и го регистрира нејзиниот манифест
- Phar::mount — Монтирајте надворешна патека или датотека на виртуелна локација во рамките на phar архивата
- Phar::mungServer — Defines a list of up to 4 $_SERVER variables that should be modified for execution
- Phar::offsetExists — Монтирај надворешна патека или датотека на виртуелна локација во архивата phar
- Phar::offsetGet — Определува дали датотеката постои во phar
- Phar::offsetSet — Добива PharFileInfo објект за специфична датотека
- Phar::offsetUnset — Постави ја содржината на внатрешна датотека со онаа на надворешна датотека
- Phar::running — Отстрани датотека од phar
- Phar::setAlias — Враќа целосна патека на дискот или целосен URL на phar до моментално извршуваната архива phar
- Phar::setDefaultStub — Постави алијас за архивата phar
- Phar::setMetadata — Се користи за поставување на PHP вчитувачот или bootstrap stub на архивата Phar на стандарден вчитувач
- Phar::setSignatureAlgorithm — Поставува мета-податоци на архивата phar
- Phar::setStub — Постави алгоритам за потпис за phar и примени го
- Phar::startBuffering — Се користи за поставување на PHP вчитувачот или bootstrap stub на архивата Phar
- Phar::stopBuffering — Започни со баферирање на операциите за пишување на Phar, не менувај го објектот Phar на дискот
- Phar::unlinkArchive — Престани со баферирање на барањата за пишување до архивата Phar и зачувај ги промените на дискот
- Phar::webPhar — Целосно отстрани архива phar од дискот и од меморијата
- PharData — Класата PharData
- PharData::addEmptyDir — Пренасочува барање од веб прелистувач до внатрешна датотека во архивата phar
- PharData::addFile — Додај празна директориум во tar/zip архивата
- PharData::addFromString — Додај датотека од датотечниот систем во tar/zip архивата
- PharData::buildFromDirectory — Додај датотека од стринг во tar/zip архивата
- PharData::buildFromIterator — Конструирај tar/zip архива од датотеките во директориум
- PharData::compress — Ја компресира целата tar/zip архива користејќи Gzip или Bzip2 компресија
- PharData::compressFiles — Ја компресира целата tar/zip архива користејќи Gzip или Bzip2 компресија
- PharData::__construct — Ги компресира сите датотеки во тековната tar/zip архива
- PharData::convertToData — Конвертирај phar архива во не-извршна tar или zip датотека
- PharData::convertToExecutable — Конструира не-извршен tar или zip објект од архива
- PharData::copy — Конвертира не-извршен tar/zip архив во извршен phar архив
- PharData::decompress — Декомпресирај ја целата Phar архива
- PharData::decompressFiles — Копира датотека внатре во tar/zip архивата во нова датотека во истата архива
- PharData::delMetadata — Ги декомпресира сите датотеки во тековната zip архива
- PharData::delete — Ги брише глобалните метаподатоци на zip архива
- PharData::__destruct — Брише датотека од tar/zip архива
- PharData::extractTo — Уништува не-извршен tar или zip објект од архива
- PharData::isWritable — Ја екстрахира содржината на tar/zip архива во директориум
- PharData::offsetSet — Враќа true ако tar/zip архивата може да се менува
- PharData::offsetUnset — Поставува содржината на датотека во tar/zip на содржината од надворешна датотека или стринг
- PharData::setAlias — Отстранува датотека од tar/zip архива
- PharData::setDefaultStub — Лажна функција (Phar::setAlias не е валидна за PharData)
- PharData::setMetadata — Се користи за поставување на PHP вчитувачот или bootstrap stub на архивата Phar на стандарден вчитувач
- PharData::setSignatureAlgorithm — Поставува мета-податоци на архивата phar
- PharData::setStub — Лажна функција (Phar::setDefaultStub не е валидна за PharData)
- PharFileInfo — Класата PharFileInfo
- PharFileInfo::chmod — Лажна функција (Phar::setStub не е валидна за PharData)
- PharFileInfo::compress — Поставува битови за дозвола специфични за датотеката
- PharFileInfo::__construct — Ја компресира тековната Phar ставка со zlib или bzip2 компресија
- PharFileInfo::decompress — Конструира Phar објект од ставка
- PharFileInfo::delMetadata — Ги брише метаподатоците на записот
- PharFileInfo::__destruct — Ги брише метаподатоците на записот
- PharFileInfo::getCRC32 — Уништува Phar објект од запис
- PharFileInfo::getCompressedSize — Враќа CRC32 код или фрла исклучок ако CRC не е потврден
- PharFileInfo::getContent — Враќа вистинска големина на датотеката (со компресија) во Phar архивата
- PharFileInfo::getMetadata — Добива целокупна содржина на датотеката од записот
- PharFileInfo::getPharFlags — Враќа метаподатоци специфични за датотеката зачувани со датотека
- PharFileInfo::hasMetadata — Враќа знаменца за запис на датотека
- PharFileInfo::isCRCChecked — Враќа метаподатоци на записот
- PharFileInfo::isCompressed — Враќа дали CRC на записот на датотеката е потврден
- PharFileInfo::setMetadata — Враќа дали записот е компресиран
- PharException — Класата PharException
Белешки од корисници 6 белешки
If you get blank pages when trying to access a phar web-page, then you probably have Suhosin on your PHP (like in Debian and Ubuntu), and you need to ad this to your php.ini to allow execution of PHAR archives :
suhosin.executor.include.whitelist="phar"Users should set the `sys_temp_dir` directive.
PHAR stores temporary files in either `sys_temp_dir` or the current working directory(CWD).
This is especially important if you're CWD is on a remote file system. Often web server clusters will share a common file system between each web server (using NFS, DFS, etc...). In such scenarios, if you don't set `sys_temp_dir` to a local directory, PHAR will be creating temporary files over the network, which will result in performance and functionality problems.Here is a very simple program for creating phar files with CLI. Note that it requires phar.readonly in php.ini set to false (Off).
<?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 "Missing output file name" . PHP_EOL;
exit(1);
}
$filename = $argv[$i];
break;
case "-i":
$i++;
if ($i >= $argc) {
echo "Missing input directory name" . PHP_EOL;
exit(1);
}
$dir = $argv[$i];
break;
case "-p":
$i++;
if ($i >= $argc) {
echo "Missing regular expression pattern" . PHP_EOL;
exit(1);
}
$regex = $argv[$i];
break;
case "-m":
$i++;
if ($i >= $argc) {
echo "Missing main file" . PHP_EOL;
exit(1);
}
$main = $argv[$i];
break;
case "-b":
$i++;
if ($i >= $argc) {
echo "Missing shebang of file" . 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);
}when read via phar://, stream will unserialize object including phar file
Use this to create phar
<?php
// create new Phar
$phar = new Phar('lemon.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');
// add object of any class as meta data
class AnyClass {}
$object = new AnyClass;
$object->data = 'Chanh';
$phar->setMetadata($object);
$phar->stopBuffering();
?>
and read it by:
<?php
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// output: Chanh
file_get_contents('phar://test.phar');
?>Here is a very simple class to build a phar file from a given source directory. You can use this for your own project and simple deployment.
But my main goal was to show how to use PHAR functions in a simple way.
<?php
class BuildPhar
{
private $_sourceDirectory = null;
private $_stubFile = null;
private $_outputDirectory = null;
private $_pharFileName = null;
/**
* @param $_sourceDirectory // This is the directory where your project is stored.
* @param $stubFile // Name the entry point for your phar file. This file have to be within the source
* directory.
* @param null $_outputDirectory // Directory where the phar file will be placed.
* @param string $pharFileName // Name of your final *.phar file.
*/
public function __construct($_sourceDirectory, $stubFile, $_outputDirectory = null, $pharFileName = 'myPhar.phar') {
if ((file_exists($_sourceDirectory) === false) || (is_dir($_sourceDirectory) === false)) {
throw new Exception('No valid source directory given.');
}
$this->_sourceDirectory = $_sourceDirectory;
if (file_exists($this->_sourceDirectory.'/'.$stubFile) === false) {
throw new Exception('Your given stub file doesn\'t exists.');
}
$this->_stubFile = $stubFile;
if(empty($pharFileName) === true) {
throw new Exception('Your given output name for your phar-file is empty.');
}
$this->_pharFileName = $pharFileName;
if ((empty($_outputDirectory) === true) || (file_exists($_outputDirectory) === false) || (is_dir($_outputDirectory) === false)) {
if ($_outputDirectory !== null) {
trigger_error ( 'Your output directory is invalid. We set the fallback to: "'.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
//Example Usage:
$builder = new BuildPhar(
dirname(__FILE__).'/_source',
'my_default_stub.php',
dirname(__FILE__).'/_output',
'my-phar-file.phar'
);