【问题标题】:What settings can impact a Phar's ability to access itself?哪些设置会影响 Phar 访问自身的能力?
【发布时间】:2017-11-23 12:36:53
【问题描述】:

这有点奇怪,所以请多多包涵。

我正在尝试在我们的自定义平台上启动并运行 Bugsnag。

样板代码如下:

if ( !include_once($NP->settings->paths->external .'/Bugsnag/guzzle.phar') ) 
  exit('Failed to load ERROR: guzzle');
if ( !include_once($NP->settings->paths->external .'/Bugsnag/bugsnag.phar') ) 
  exit('Failed to load ERROR SYSTEM: bugsnag');

不幸的是,这引发了异常:

Fatal error: require(): Failed opening required 'phar://guzzle.phar/autoloader.php'

但是,如果我尝试将其加载到我们的平台之外,它似乎可以正常运行。

由于我并不完全熟悉使用 phar 的细节,我们可以设置什么来干扰 phar 在其自己的容器中引用的能力?

信息:

Ubuntu 16.04.2 LTS
PHP 7.0.18-0ubuntu0.16.04.1 (Phar is native)

Phar EXT version: 2.0.2
Phar API version: 1.1.1
Phar-based phar archives: enabled
Tar-based phar archives: enabled
ZIP-based phar archives: enabled
gzip compression: enabled
bzip2 compression: disabled
Native OpenSSL support: enabled

phar.readonly: On
phar.require_hash: Off

我们将不胜感激。

谢谢!

更新:在与同事进行一些测试后,我注意到即使将样板代码放在我们主要平台启动脚本的最顶部,仍然会抛出错误。在这种情况下,我们唯一能想到的更改是目录更改(因为引导脚本位于include_path 中)。将external 目录添加到php 的include_path 后,它似乎工作了。然而,我对此感到困惑,因为我的理解是 Phar 文件是自包含的,特别是没有这样的问题。 为什么已经成功包含 Phar 文件后,会突然无法引用自己?

更新:因此,上述更新并不是真正的修复。结果很奇怪。它会旋转一次很好,然后在接下来的几次失败。同样,这是在它之前没有其他代码加载的时候。 一些有趣的事情:如果我们重新启动 Apache,它会在第一个页面加载时加载。之后的一切都失败了。

【问题讨论】:

  • 如果你重新启动 Apache 就可以了。听起来很熟悉;你有没有安装过某种 PHP op-cache?

标签: php guzzle phar bugsnag


【解决方案1】:

不确定,但我认为您不能从另一个 PHAR 中引用一个 PHAR。

为什么不使用 Composer 的常规设置(安装所有的 deps),然后使用 Box project 创建一个 PHAR?

【讨论】:

  • 我们不是在 phar 中引用。这是尝试加载 phar 的一般代码。 :(
  • 但是您将 deps 用作 PHAR,并且您正试图将它们打包到另一个 PHAR 中。还是我错了?
  • 不,我们不会将它们包装在另一个 PHAR 中。这只是普通的站点代码(没有 PHAR),并且试图让 Bugsnag 工作,这需要我们加载这两个 PHAR。我们目前没有使用 Composer,因为系统没有为它设置,而且这是一个客户端,所以我无法完全控制一切。 ;) 作为参考,这就是我们正在做的事情:docs.bugsnag.com/platforms/php/other/#using-a-phar-package
【解决方案2】:

guzzle.phar 是指向不同名称文件的符号链接吗?

否则,您可以在通过Phar 类加载.phar 文件时通过设置不同的别名来中断内部链接:

new Phar('guzzle.phar, 0, 'differentalias.phar');

【讨论】:

  • 不,这不是符号链接。此外,OP 中的更新解决方案实际上并不总是有效。这很奇怪。我们正在对文件进行直接包含,然后它只是拒绝正确加载,抛出该错误。如果它位于 first apache 正在拉取的脚本的顶部,那很好,但是当我们将它放在另一个包含的脚本中时(即使它是包含的脚本中的第一件事),它会抛出错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多