如何从内置的PHP 5.4 webserver运行webphar PHP文件?

时间:2014-05-28 21:42:17

标签: php php-5.4 phar

根据标题,我创建了一个非常简单的测试工具。我想用内置的网络服务器(PHP 5.4)测试它,但似乎不可能。

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

结果:空白页面(在phar前端控制器中index.php执行一些HTML输出。)

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

使用加载程序脚本:

<?php

require 'phar://myphar.php'

再次出现空白页面。

这是可能的还是我必须使用Apache?

编辑:一年后我再次需要这个。这是发生的事情(来自答案):

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 &#34;前缀&#34;!

使用Apache并将目录索引设置为app.phar按预期工作。

8 个答案:

答案 0 :(得分:5)

由于php -S localhost:80 -t /path/to/phar参数旨在用于目录,因此

-t无效。诀窍是php webserver支持将路由器作为参数传递。因此,假设你的phar在/ tmp(它可以在任何地方),这就是你如何创建一个简单的路由器,并设置网络服务器:

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

答案 1 :(得分:5)

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();

答案 2 :(得分:3)

经过几个小时的内置Web服务器,终于找到了您正在寻找的解决方案。关键是Web服务器的路由器文件。请遵循以下程序

1)为内置Web服务器创建一个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的应用程序名称,在我的情况下&#34; / myapp&#34;然后解压缩您要访问的文件路径。然后将所需的phared文件包含到当前脚本中并退出。否则正常处理请求。

2)按如下方式启动内置Web服务器:

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

这是做什么的:启动内置的web服务器,将当前目录作为文档根文件夹,并使用router.php作为路由器文件(放在同一个文件夹中)

3)在浏览器中发出如下请求:

    http://localhost/myapp/foo/bar

您将从应用程序.phar文件中获取Phar-ed文件

如有疑问,请告诉我。

注意:您还可以使用正则表达式匹配router.php中的Uri模式

答案 3 :(得分:2)

所以,我不明白你为什么需要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

并查看脚本执行的结果

答案 4 :(得分:2)

如果您愿意更灵活一点,那么您可以通过创建index.php文件然后包含.phar可能的according to the documentation来表达以下内容:< / p>

  

使用Phar存档库与使用任何其他PHP库完全相同:

因此,你可以正常包含它:

<?php require_once "app.phar";

运行php -S localhost:80后,将执行index.php,您只需通过http://localhost访问它。

答案 5 :(得分:1)

如果您正在使用xampp服务,则在Windows上,您可以在命令行中使用此命令。

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

答案 6 :(得分:0)

如何在与该app.phar相同的目录中创建index.php文件。它的内容应该是:

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

然后通过使用命令php -S localhost:80 /path/to/pharapp/index.php

提供index.php文件来访问它

答案 7 :(得分:-1)

您可以使用内置的Web服务器运行webphar,方法是将phar重命名为.php扩展名(例如mv app.phar app.php),指向该目录:

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

并以http://localhost/app.php/someroute.php的身份访问它。棘手的部分通常是setting up the stubmunging the environmentgenerating the phar