无法打开流:找不到合适的包装器


failed to open stream: no suitable wrapper could be found

您好,我正在将PHP文件从一个网站实现到另一个网站,这是我尝试使用已实现的PHP文件打开以下页面时收到的以下错误消息:

http://www.holidaysavers.ca/europe-destinations-canada.php

基本上,我从一个网站导入另一个网站的PHP文件是相同的,但是它们在原始网站上工作,但是当我将它们实施到新网站中时,它不再起作用了。

你能帮助我解决这个问题吗?

谢谢

不能将外部网站/服务器上的 PHP 脚本包含到本地脚本中 - 除非您在php.ini上启用allow_url_include(如果您有权访问它)

相反,您可以让该网站/服务器呈现页面并在本地脚本上获取生成的 html 输出。

替换脚本中的以下行:

include('http://www.holidaysavers.ca/europe-canada.php?detour');

有了这个:

echo file_get_contents('http://www.holidaysavers.ca/europe-canada.php?detour');

你能从"欧洲-目的地-加拿大.php发布代码吗? 看起来脚本要求执行在此新站点/服务器上的 php 设置中未配置的操作

我真的不知道你正在使用哪种类型的主机,或者你是否正在使用 Xampp,我确实有一个简单的修复方法,适用于 xampp 和可能的其他 Web 服务器软件。转到您的 php.ini 文件,您可以搜索该文件或只是在 c:''xampp'php'php.ini 中查找它,php.ini应该在服务器软件文件夹的 php 文件夹中。现在在 php.ini 文件中搜索 allow_url_include,如果它还没有打开或其他东西,请将 Off 替换为 On。这很可能是修复程序,因为它对我有用。

如果我知道您使用的是托管服务器还是家庭服务器,我可能会进一步提供帮助。如果您使用的是托管网站,请分享您正在使用的托管服务类型,以便我可以进一步检查它。

以随机远程 php 文件为例。

目标是在本地使用此远程文件,确保它没有更改或被更改。远程文件将仅下载一次。

硬编码sha256签名可避免在启动时使用网络。这只是一个基础,可以转向许多方案,例如检查更新,具体取决于您的需求。

<?php
$lib_url = "https://raw.githubusercontent.com/getopt-php/getopt-php/master/src/CommandInterface.php";
$lib_filename = basename($lib_url);
// SHA256 signature
$lib_signature = hash_file("sha256",$lib_url); // "dba0b3fe70b52adbb8376be6a256d2cc371b2fe49ef35f0c6e15cd6d60c319dd"
// Hardcode the signature to avoid a network call on startup:
//$lib_signature = "dba0b3fe70b52adbb8376be6a256d2cc371b2fe49ef35f0c6e15cd6d60c319dd";
if (!is_file($lib_filename) || $lib_signature != hash_file("sha256",$lib_filename)){
  // No local copy found, or file signature invalid, get a copy
  copy($lib_url, $lib_filename);
}
require $lib_filename;

如果您打算在没有作曲家的情况下将程序共享为单个文件,这将非常有用。

对于托管在 Github 上的文件,提供了一个ETag HTTP 标头,它可用于避免下载整个文件。

php -r 'var_dump(json_decode(get_headers("https://raw.githubusercontent.com/getopt-php/getopt-php/master/src/CommandInterface.php", 1)["ETag"]));'
//string(64) "c0153dbd04652cc11cddb0876c5abcc9950cac7378960223cbbe6cf4833a0d6b"

ETag HTTP 响应标头是特定版本的标识符的资源。它使缓存更高效并节省带宽,因为如果内容没有改变。

我找到的解决方案:

  1. 在 PHP 上启用allow_url_include.ini
  2. 如果您有权访问 WHM,请转到多 PHP 设置并选择特定的 PHP 版本并启用allow_url_include。这将为特定服务器上的所有网站启用该选项。
Warning: include() [function.include]: URL file-access is disabled in the server configuration in /home/content/91/8151691/html/HolidaySavers.ca/europe-destinations-canada.php on line 52

说明了一切。我相信这叫做XXS。您似乎正在尝试包含基于URL的文件,该文件在服务器配置中被拒绝,这是两种情况之一。

  1. 您正在尝试从站点 A 在站点 B 上包含该文件,然后您将使用该文件而不是include('WhateverFile'); file_get_contents('WhateverFile');但这只会返回客户端数据,因为它是 HTTP 请求;

  2. 您在站点 B 上复制了该文件,但忘记更新域配置。确保包含路径反映了您正在其上运行脚本的站点。

    include(dir($_SERVER['SCRIPT_FILENAME']) . DIRECTORY_SEPARATOR . 'WhateverFile.php');
    

无论如何。我必须实际检查所述文件上的第 52 行,以了解为什么 PHP 会详细向您抱怨,哈哈