如何在内置的PHP 5.4 Web服务器中运行webphar PHP文件?

16

根据标题,我创建了一个非常简单的测试phar文件。我想使用内置的web服务器(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前缀

使用Apache并将目录索引设置为app.phar,可以按预期运行。


1
你是否在日志中看到了加载器脚本选项的错误信息? - halfer
也许你的 myphar.php 中存在一些语法错误。如果你执行 echo "<?php phpinfo();" > myphar.php,会发生什么呢? - ahuigo
请查看此链接:https://github.com/phpDocumentor/phpDocumentor2/issues/1004 希望能对你有所帮助 :) - Varshaan
8个回答

5

php -S localhost:80 /path/to/router.php不起作用,因为-t参数是用于目录的。但是有一个技巧,即PHP Web服务器支持将路由器作为参数传递。因此,假设您的phar文件在/tmp目录中(它可以在任何地方),这是如何创建一个简单的路由器并设置Web服务器:

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

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

3

经过数小时的尝试,终于找到了你所需要的解决方案。关键在于内置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,例如在我的情况下为“/myapp”,然后提取要访问的文件路径。接着将所需的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 模式。

2
如果您愿意更加灵活,可以通过创建一个index.php文件并包含您的.phar来实现您想要的功能。根据文档介绍,这是可能的,因为:

使用Phar档案库与使用任何其他PHP库相同:

因此,您可以像下面这样正常地包含它:
<?php require_once "app.phar";

今日免费次数已满, 请开通会员/明日再来

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

并查看脚本执行的结果


抱歉回答晚了,但这种方法行不通:Web服务器说:/path/to/myphar.php不是一个目录! - gremo

1
在Windows上,如果您正在使用xampp服务器,则可以在命令行中使用此命令。
C:\xampp\php>"C:\xampp\php\php.exe" "C:\xampp\php\pharcommand.phar"

0
在与 app.phar 相同的目录中创建一个 index.php 文件,其内容应为:
<?php
require "myapp.phar";
?>

然后通过使用命令php -S localhost:80 /path/to/pharapp/index.php来服务于该index.php文件并访问它。


-1

您可以通过将 phar 重命名为 .php 扩展名(例如,mv app.phar app.php),并指向该目录,在内置的 Web 服务器上运行 webphar:

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

并将其访问为http://localhost/app.php/someroute.php。棘手的部分通常是设置存根, 修改环境, 和 生成phar


抱歉回复晚了,但这个方法行不通:Web服务器说:/path/to/myphar.php不是一个目录! - gremo
@gremo 请确保“-t /path/to/phar”只指向包含phar文件的目录,而不是phar文件本身(例如,不是“/path/to/phar/myphar.php”)。如果您在与phar文件相同的目录中运行此命令,则可以省略“-t”部分。 - Josh Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接