Как запустить PHP файл webphar со встроенного веб-сервера PHP 5.4?

В соответствии с заголовком я создал очень простой тестовый phar. Я бы хотел протестировать его со встроенным веб-сервером (PHP 5.4), но это кажется невозможным.

php -S localhost:80 /path/to/myphar.php

Результат: пустая страница (в контроллере phar front index.php выполняется некоторый вывод HTML).

php -S localhost:80 -t /path/to/folder_with_index_and_phar

С загрузчиком script:

<?php

require 'phar://myphar.php'

Результат снова на пустой странице.

Возможно ли это, или я должен использовать Apache?

EDIT: через год мне это нужно снова. Вот что происходит (из ответов):

php -S localhost:80 -t /path/to/app.phar
php -S localhost:80 -t /path/to/app.phar

Результаты в ошибке:/path/to/app.phar не является каталогом.

В то время как:

php -S localhost:80 -t .
http://localost/app.phar/foo/bar

Работает, но мне не нужен префикс app.phar "!

Использование Apache и установка индекса каталога в app.phar работает как ожидалось.

Ответы

Ответ 1

php -S localhost:80 -t /path/to/phar не будет работать, поскольку аргумент -t предназначен для использования в каталогах. Фокус в том, что веб-сервер php поддерживает передачу маршрутизатора в качестве аргумента. Поэтому предположим, что ваш phar находится в /tmp (он может быть где угодно), вот как вы создаете простой маршрутизатор и настраиваете веб-сервер:

echo '<?php require("/path/to/phar");'>/tmp/router.php
php -S localhost:80 /tmp/router.php

Ответ 2

php -S localhost:8080 phpinfo.phar

Мне показалось, что это работает для меня просто из простого файла phar, который я создал, чтобы поставить phpinfo();

В документах PHP я заметил, что при создании файла PHAR вам необходимо настроить заглушки для интерфейсов CLI и WWW.

http://php.net/manual/en/phar.buildfromdirectory.php

<?php
// create with alias "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
// add all files in the project
$phar->buildFromDirectory(dirname(__FILE__) . '/project');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));

ИЗМЕНИТЬ

В частности, это то, что я сделал.

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

$phar = new Phar('phpinfo.phar', 0, 'phpinfo.phar');

$phar->buildFromDirectory(__DIR__ . '/phpinfo');
$phar->setStub($phar->createDefaultStub('index.php'));

для создания файла phar каталога:

phpinfo/
└── index.php

и index.php были просто:

<?php phpinfo();

Ответ 3

После нескольких часов общения со встроенным веб-сервером, наконец, нашли решение того, что вы ищете. Ключ - это файл маршрутизатора для веб-сервера. Следуйте процедуре ниже.

1) Создайте файл router.php для встроенного веб-сервера со следующим контентом

    $path = $_SERVER["REQUEST_URI"];
    if($pathPosition = strpos($path,'/myapp') !== false){
        //Request has been made to Phar-ed application
        $pathPosition += strlen('/myapp');
        $file = substr($path, $pathPosition);

        //Here include the base path of your Phar-ed application with file path
        //I placed myphar.phar and router.php in the root directory for this example
        require_once("phar://myphar.phar/$file");
        exit;
    }
    return FALSE;

Что это значит: он проверяет Uri для вашего имени приложения, в моем случае "/myapp", а затем извлекает путь к файлу, к которому вы хотите получить доступ. Затем включает желаемый файл с файлами в текущий script и завершает работу. Else обрабатывает запрос как обычно.

2) Запустите встроенный веб-сервер следующим образом:

     php -S localhost:80 -t . router.php

Что это делает: запускает встроенный веб-сервер, создавая текущий каталог в качестве корневой папки документа и использует router.php в качестве файла маршрутизатора (помещается в одну папку)

3) Сделайте запрос в браузере следующим образом:

    http://localhost/myapp/foo/bar

Вы получите файл Phar-ed из вашего приложения .phar file

Сообщите мне в случае вопросов.

Примечание. Вы также можете использовать регулярное выражение для соответствия шаблону Uri в файле router.php

Ответ 4

Итак, я не понимаю, зачем нужен сервер Apache. После команды

php -S localhost:80 -t /path/to/myphar.php

PHP 5.5.9-1ubuntu4 Development Server started at Fri Jun  6 22:27:49 2014
Listening on http://localhost:80
Document root is /tmp/http
Press Ctrl-C to quit.

означает, что все хорошо, вы переходите в адресную строку вашего браузера пишите

http://localhost:80

и увидеть результат выполнения script

Ответ 5

Если вы готовы быть более гибким, вы можете сделать то, что хотите, создав файл index.php, а затем включив .phar, который возможен в соответствии с документацией, которая гласит, что:

Использование библиотеки архивов Phar идентично использованию любой другой библиотеки PHP:

Поэтому вы можете просто включить его как обычно:

<?php require_once "app.phar";

После запуска php -S localhost:80 будет запущен index.php, и вы можете просто получить к нему доступ через http://localhost.

Ответ 6

В окнах, если вы используете службу xampp, вы можете использовать эту команду в командной строке.

C:\xampp\php>"C:\xampp\php\php.exe" "C:\xampp\php\pharcommand.phar"

Ответ 7

Как создать файл index.php в том же каталоге, что и app.phar. его содержимое должно быть:

<?php
require "myapp.phar";
?>

Затем зайдите в него, выполнив этот файл index.php с помощью команды php -S localhost:80 /path/to/pharapp/index.php

Ответ 8

Вы можете запустить webphar со встроенным веб-сервером, переименовав phar, чтобы иметь расширение .php (например, mv app.phar app.php), указывая на этот каталог:

php -S localhost:80 -t /path/to/phar

и доступ к нему как http://localhost/app.php/someroute.php. Обычно сложная часть настройка заглушки, перемещение среды, и генерирует phar.