国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP - 無(wú)法開(kāi)啟流:沒(méi)有這樣的檔案或目錄
P粉145543872
P粉145543872 2023-08-23 16:30:33
0
2
1007
<p>在PHP 腳本中,無(wú)論是呼叫<code>include()</code>、<code>require()</code>、<code>fopen()</code>或其衍生類(lèi),例如<code> include_once</code>、<code>require_once</code>,甚至<code>move_uploaded_file()</code>,經(jīng)常會(huì)遇到錯(cuò)誤或警告:< /p> <blockquote> <p>無(wú)法開(kāi)啟流:沒(méi)有這樣的檔案或目錄。 </p> </blockquote> <p>快速找到問(wèn)題根本原因的好流程是什麼? </p>
P粉145543872
P粉145543872

全部回覆(2)
P粉362071992

添加到(非常好的)現(xiàn)有答案

共享託管軟體

open_basedir 可能會(huì)難倒您,因?yàn)樗梢栽?Web 伺服器設(shè)定中指定。雖然如果您運(yùn)行自己的專(zhuān)用伺服器,這很容易解決,但有一些共享託管軟體包(如 Plesk、cPanel 等)可以在每個(gè)網(wǎng)域的基礎(chǔ)上配置配置指令。由於軟體會(huì)建置設(shè)定檔(即 httpd.conf),因此您無(wú)法直接變更該文件,因?yàn)橛毠苘涹w在重新啟動(dòng)時(shí)只會(huì)覆寫(xiě)它。

透過(guò) Plesk,他們提供了一個(gè)位置來(lái)覆寫(xiě)所提供的 httpd.conf(稱(chēng)為 vhost.conf)。只有伺服器管理員可以寫(xiě)入此文件。 Apache 的設(shè)定看起來(lái)像這樣

<Directory /var/www/vhosts/domain.com>
    <IfModule mod_php5.c>
        php_admin_flag engine on
        php_admin_flag safe_mode off
        php_admin_value open_basedir "/var/www/vhosts/domain.com:/tmp:/usr/share/pear:/local/PEAR"
    </IfModule>
</Directory>

讓您的伺服器管理員查閱他們使用的託管和 Web 伺服器軟體的手冊(cè)。

檔案權(quán)限

要注意的是,透過(guò) Web 伺服器執(zhí)行檔與命令列或 cron 作業(yè)執(zhí)行有很大不同。最大的區(qū)別是您的網(wǎng)頁(yè)伺服器有自己的使用者和權(quán)限。出於安全原因,該用戶(hù)受到很大限制。例如,Apache 通常是 apachewww-datahttpd(取決於您的伺服器)。 cron 作業(yè)或 CLI 執(zhí)行具有執(zhí)行它的使用者所擁有的任何權(quán)限(即以 root 身分執(zhí)行 PHP 腳本將以 root 權(quán)限執(zhí)行)。

很多時(shí)候人們會(huì)透過(guò)執(zhí)行以下操作來(lái)解決權(quán)限問(wèn)題(Linux 範(fàn)例)

chmod 777 /path/to/file

這不是一個(gè)聰明的主意,因?yàn)闄n案或目錄現(xiàn)在是全域可寫(xiě)的。如果您擁有該伺服器並且是唯一的用戶(hù),那麼這並不是什麼大問(wèn)題,但如果您位於共享託管環(huán)境中,您就授予了伺服器上的每個(gè)人存取權(quán)限。

您需要做的是確定需要存取權(quán)限的使用者並只授予他們存取權(quán)限。一旦您知道哪些使用者需要存取權(quán)限,您就需要確保

  1. 該使用者擁有該檔案並且可能擁有父目錄(尤其是如果您要寫(xiě)入檔案則為父目錄)。在大多數(shù)共享託管環(huán)境中,這不會(huì)成為問(wèn)題,因?yàn)槟挠脩?hù)應(yīng)該擁有根目錄下的所有檔案。下面顯示了一個(gè) Linux 範(fàn)例

    chown apache:apache /path/to/file
  2. 該使用者(且只有該使用者)具有存取權(quán)限。在Linux 中,一個(gè)好的做法是chmod 600(只有所有者可以讀寫(xiě))或chmod 644(所有者可以寫(xiě)入,但每個(gè)人都可以讀?。?/p>

您可以閱讀有關(guān) Linux 的更廣泛的討論/此處的 Unix 權(quán)限和用戶(hù)

#
P粉268654873

可能會(huì)遇到此錯(cuò)誤的原因有很多,因此首先檢查哪些內(nèi)容的良好清單會(huì)很有幫助。

假設(shè)我們正在對(duì)以下行進(jìn)行故障排除:

require "/path/to/file"


#

清單


#

1。檢查檔案路徑是否有拼字錯(cuò)誤

  • 手動(dòng)檢查(透過(guò)目視檢查路徑)
  • 或?qū)?code>require* 或include* 呼叫的任何內(nèi)容移動(dòng)到自己的變數(shù)中,回顯它,複製它,然後嘗試從最終端存取它:

    $path = "/path/to/file";
    
    echo "Path : $path";
    
    require "$path";

    然後,在終端機(jī)中:

    cat <file path pasted>


#

2。檢查相對(duì)與絕對(duì)路徑注意事項(xiàng)的檔案路徑是否正確

最佳實(shí)踐:

為了讓您的腳本在移動(dòng)內(nèi)容時(shí)保持健壯,同時(shí)仍在執(zhí)行時(shí)間產(chǎn)生絕對(duì)路徑,您有 2 個(gè)選項(xiàng):

  1. 使用 require __DIR__ 。 “/相對(duì)/路徑/來(lái)自/當(dāng)前/檔案”。 __DIR__ 魔術(shù)常數(shù) 傳回目前檔案的目錄。
  2. 自己定義一個(gè)SITE_ROOT常數(shù):

    • 在網(wǎng)站目錄的根目錄下建立一個(gè)文件,例如config.php
    • config.php中寫(xiě)入

      define('SITE_ROOT', __DIR__);
    • 在要引用網(wǎng)站根資料夾的每個(gè)檔案中,包含 config.php,然後在任何位置使用 SITE_ROOT 常數(shù): p>

      require_once __DIR__."/../config.php";
      ...
      require_once SITE_ROOT."/other/file.php";

這 2 種做法也使您的應(yīng)用程式更具可移植性,因?yàn)樗灰蕾?lài)包含路徑等 ini 設(shè)定。


#

3。檢查您的包含路徑

另一種包含檔案的方法,既不是相對(duì)也不是純粹絕對(duì),是依賴(lài) 包含路徑。對(duì)於諸如 Zend 框架之類(lèi)的庫(kù)或框架來(lái)說(shuō),通常就是這種情況。

這樣的包含將如下所示:

include "Zend/Mail/Protocol/Imap.php"

在這種情況下,您需要確?!竄end」所在的資料夾是包含路徑的一部分。

您可以使用以下命令檢查包含路徑:

echo get_include_path();

您可以使用以下命令向其中新增資料夾:

set_include_path(get_include_path().":"."/path/to/new/folder");


#

4。檢查您的伺服器是否有權(quán)存取該檔案

總而言之,執(zhí)行伺服器進(jìn)程(Apache 或 PHP)的使用者可能根本沒(méi)有讀取或?qū)懭朐摍n案的權(quán)限。

要檢查伺服器正在哪個(gè)使用者下運(yùn)行,您可以使用 posix_getpwuid:

$user = posix_getpwuid(posix_geteuid());

var_dump($user);

要尋找檔案的權(quán)限,請(qǐng)?jiān)诮K端機(jī)中鍵入以下命令:

ls -l <path/to/file>

並查看權(quán)限符號(hào)表示法


#

5。檢查 PHP 設(shè)定

如果以上方法都不起作用,問(wèn)題可能是某些 PHP 設(shè)定禁止它存取該檔案。

三個(gè)設(shè)定可能相關(guān):

  1. open_basedir
    • 如果設(shè)定了此項(xiàng),PHP 將無(wú)法存取指定目錄之外的任何檔案(甚至無(wú)法透過(guò)符號(hào)連結(jié)存?。?。
    • 但是,預(yù)設(shè)行為是不設(shè)置,在這種情況下沒(méi)有限制
    • 可以透過(guò)呼叫 phpinfo()進(jìn)行檢查> 或使用 ini_get("open_basedir")
    • 您可以透過(guò)編輯 php.ini 檔案或 httpd.conf 檔案來(lái)更改設(shè)定
  2. 安全模式
    • 如果啟用此功能,可能會(huì)受到限制。然而,這在 PHP 5.4 中已被刪除。如果您仍在使用支援安全模式的版本,請(qǐng)升級(jí)至仍受支援的 PHP 版本。
  3. allow_url_fopen 和allow_url_include#
    • 這僅適用於透過(guò)網(wǎng)路進(jìn)程(例如 http://)包含或開(kāi)啟文件,不適用於嘗試包含本機(jī)檔案系統(tǒng)上的文件
    • 可以使用 ini_get("allow_url_include") 檢查並使用 ini_set("allow_url_include", "1") 設(shè)定


#

極端情況

如果上述方法都無(wú)法診斷問(wèn)題,則可能會(huì)發(fā)生以下一些特殊情況:


#

1。依賴(lài)包含路徑的庫(kù)的包含

您可能會(huì)使用相對(duì)或絕對(duì)路徑包含一個(gè)庫(kù),例如 Zend 框架。例如:

require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"

但是你還是會(huì)遇到同類(lèi)型的錯(cuò)誤。

發(fā)生這種情況的原因是您(成功)包含的檔案本身俱有另一個(gè)檔案的包含語(yǔ)句,而第二個(gè)包含語(yǔ)句假定您已將該程式庫(kù)的路徑新增至包含路徑。

例如,前面提到的 Zend 框架檔案可能包含以下內(nèi)容:

include "Zend/Mail/Protocol/Exception.php"

既不是透過(guò)相對(duì)路徑包含,也不是透過(guò)絕對(duì)路徑包含。假設(shè)Zend框架目錄已新增至包含路徑。

在這種情況下,唯一實(shí)用的解決方案是將目錄新增至包含路徑。


#

2。 SELinux

如果您運(yùn)行的是安全增強(qiáng)型 Linux,那麼這可能是問(wèn)題的原因,因?yàn)榫芙^從伺服器存取該檔案。

要檢查系統(tǒng)上是否啟用了 SELinux,請(qǐng)?jiān)诮K端機(jī)中執(zhí)行 sestatus 指令。如果該命令不存在,則表示您的系統(tǒng)上不存在 SELinux。如果它確實(shí)存在,那麼它應(yīng)該告訴您它是否被強(qiáng)制執(zhí)行。

要檢查 SELinux 策略是否是問(wèn)題的原因,您可以嘗試暫時(shí)關(guān)閉。但要小心,因?yàn)檫@將完全禁用保護(hù)。不要在生產(chǎn)伺服器上執(zhí)行此操作。

setenforce 0

如果您在關(guān)閉 SELinux 後不再遇到問(wèn)題,那麼這就是根本原因。

要解決這個(gè)問(wèn)題,您必須相應(yīng)地設(shè)定 SELinux。

以下上下文類(lèi)型是必要的:

  • httpd_sys_content_t 用於您希望伺服器能夠讀取的檔案
  • httpd_sys_rw_content_t 用於您想要讀寫(xiě)存取權(quán)限的檔案
  • httpd_log_t 用於日誌檔案
  • httpd_cache_t 用於快取目錄
#

例如,若要將 httpd_sys_content_t 上下文類(lèi)型指派給您的網(wǎng)站根目錄,請(qǐng)執(zhí)行:

semanage fcontext -a -t httpd_sys_content_t "/path/to/root(/.*)?"
restorecon -Rv /path/to/root

如果您的檔案位於主目錄中,您還需要開(kāi)啟 httpd_enable_homedirs 布林值:

setsebool -P httpd_enable_homedirs 1

無(wú)論如何,SELinux 拒絕存取檔案的原因可能有多種,具體取決於您的策略。所以你需要對(duì)此進(jìn)行調(diào)查。 此處 是專(zhuān)門(mén)為 Web 伺服器設(shè)定 SELinux 的教學(xué)。


#

3。交響樂(lè)

如果您使用 Symfony,並且在上傳到伺服器時(shí)遇到此錯(cuò)誤,則可能是應(yīng)用程式的快取尚未重置,因?yàn)?app/cache 已上傳,或者該快取尚未清除。

您可以透過(guò)執(zhí)行以下控制臺(tái)命令來(lái)測(cè)試並修復(fù)此問(wèn)題:

cache:clear


#

4。 Zip 檔案中的非 ACSII 字元

顯然,當(dāng) zip 中的某些檔案的檔案名稱(chēng)中包含非 ASCII 字元(例如“é”)時(shí),呼叫 zip->close() 時(shí)也會(huì)發(fā)生此錯(cuò)誤。

一個(gè)可能的解決方案是在建立目標(biāo)檔案之前將檔案名稱(chēng)包裝在 utf8_decode() 中。

感謝 Fran Cano 確定了此問(wèn)題並提出了解決方案#

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板