【问题标题】:How to run a webphar PHP file from built-in PHP 5.4 webserver?如何从内置的 PHP 5.4 网络服务器运行 webphar PHP 文件?
【发布时间】:2014-07-18 07:27:29
【问题描述】:

根据标题,我创建了一个非常简单的测试 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“前缀”!

使用 Apache 并将目录索引设置为 app.phar 可以正常工作。

【问题讨论】:

  • 您是否从加载程序脚本选项中收到错误,可能在您的日志中?
  • 您的myphar.php 中可能有一些语法错误。如果你执行echo "&lt;?php phpinfo();" &gt; myphar.php 会发生什么
  • 检查这个github.com/phpDocumentor/phpDocumentor2/issues/1004希望它至少有点帮助:)

标签: php php-5.4 phar


【解决方案1】:

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

并查看脚本执行的结果

【讨论】:

  • 很抱歉这么晚才回答,但这不起作用:网络服务器说:/path/to/myphar.php 不是目录!
【解决方案2】:

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

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

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

【讨论】:

  • 很抱歉这么晚才回答,但这不起作用:网络服务器说:/path/to/myphar.php 不是目录!
  • @gremo 确保 "-t /path/to/phar" 只指向 包含 phar 的目录,而不是 phar 本身(例如,NOT "/path /to/phar/myphar.php")。如果您在与 phar 相同的目录中运行此命令,则可以关闭“-t”位。
【解决方案3】:

如果您愿意更灵活一点,您可以通过创建一个index.php 文件然后包含您的.phar 来做您想做的事情,这可能是according to the documentation 声明:

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

因此你可以像这样正常地包含它:

<?php require_once "app.phar";

在你运行php -S localhost:80 后,index.php 将被执行,你可以通过http://localhost 访问它。

【讨论】:

    【解决方案4】:

    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
    

    【讨论】:

      【解决方案5】:

      在使用内置 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 中的应用程序名称,在我的例子中是“/myapp”,然后提取您要访问的文件路径。然后将所需的 phared 文件包含到当前脚本中并退出。否则正常处理请求。

      2) 启动内置web服务器如下:

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

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

      3) 像这样在浏览器中发出请求:

          http://localhost/myapp/foo/bar
      

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

      如有问题请告诉我。

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

      【讨论】:

        【解决方案6】:

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

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

        然后通过使用命令php -S localhost:80 /path/to/pharapp/index.php 提供该 index.php 文件来访问它

        【讨论】:

          【解决方案7】:
          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();
          

          【讨论】:

            【解决方案8】:

            在 windows 上,如果您使用的是 xampp serve,那么您可以在命令行中使用此命令。

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

            【讨论】:

              猜你喜欢
              • 2016-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多