programing

PHP - 스트림을 열지 못했습니다. 해당 파일 또는 디렉터리가 없습니다.

randomtip 2022. 9. 12. 11:16
반응형

PHP - 스트림을 열지 못했습니다. 해당 파일 또는 디렉터리가 없습니다.

에서 PHP를 호출할지 include(),require(),fopen()또는 다음과 같은 파생상품이 있습니다.include_once,require_once '짝수'입니다move_uploaded_file() 부딪힙니다.

스트림을 열지 못했습니다. 해당 파일 또는 디렉터리가 없습니다.

문제의 근본 원인을 신속하게 찾기 위한 적절한 프로세스는 무엇입니까?

이 에러가 발생하는 이유는 여러 가지가 있기 때문에 먼저 확인해야 할 체크리스트가 도움이 됩니다.

다음 행의 트러블 슈팅에 대해 생각해 보겠습니다.

require "/path/to/file"


체크리스트


1. 파일 경로에 오타가 없는지 확인합니다.

  • 수동 점검 중 하나(경로를 육안으로 점검)
  • 움직이다라고 을 움직인다.require* ★★★★★★★★★★★★★★★★★」include*에코하고 복사한 후 단말기에서 접근해 보겠습니다.

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

    그런 다음 단말기에서 다음을 수행합니다.

    cat <file path pasted>
    


2. 상대 경로와 절대 경로의 고려사항에 대해 파일 경로가 올바른지 확인합니다.

  • 슬래시 "/"로 시작하는 경우 웹 사이트 폴더의 루트(문서 루트)가 아니라 서버의 루트를 의미합니다.
    • 예를 들어 웹 사이트의 디렉토리는 다음과 같습니다./users/tony/htdocs
  • 슬래시로 시작하지 않으면 포함 경로(아래 참조)에 의존하거나 상대 경로입니다.상대적인 경우 PHP는 현재 작업 디렉토리의 경로에 대해 상대적으로 계산합니다.
    • 따라서 웹 사이트의 루트 경로나 입력하는 파일에 상대적이지 않습니다.
    • 따라서 항상 절대 파일 경로를 사용합니다.

베스트 프랙티스:

실행 시 절대 경로를 생성하면서 스크립트를 이동할 때 스크립트를 견고하게 하려면 다음 2가지 옵션이 있습니다.

  1. require __DIR__ . "/relative/path/from/current/file". 매직 상수는 현재 파일의 디렉토리를 반환합니다.
  2. SITE_ROOT일관하다.

    • ( 파일을 만듭니다).config.php
    • config.php, 기 ,

      define('SITE_ROOT', __DIR__);
      
    • 폴더를 에, 「」를 포함합니다.config.php그에 을 하세요.SITE_ROOT, 원하는곳 라도 : 하하 constant constant constant constant원 :

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

또한 include 경로와 같은 ini 설정에 의존하지 않기 때문에 이러한 2가지 방법을 사용하면 응용 프로그램의 휴대성이 향상됩니다.


3. 포함 경로를 확인합니다.

파일을 포함시키는 또 다른 방법은 상대적이든 순수하게 절대적이든 include path에 의존하는 것입니다.이것은 종종 라이브러리 또는 Zend 프레임워크와 같은 프레임워크의 경우이다.

이러한 포함은 다음과 같습니다.

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

이 경우 "Zend"가 있는 폴더가 포함 경로의 일부인지 확인해야 합니다.

include 경로는 에서 확인할 수 있습니다.

echo get_include_path();

다음과 같이 폴더를 추가할 수 있습니다.

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


4. 서버가 해당 파일에 액세스할 수 있는지 확인합니다.

서버 프로세스(Apache 또는 PHP)를 실행하고 있는 유저에게는, 그 파일을 읽거나 쓸 수 있는 권한이 없는 경우가 있습니다.

서버가 실행되고 있는 사용자를 확인하려면 posix_getpwuid를 사용합니다.

$user = posix_getpwuid(posix_geteuid());

var_dump($user);

파일에 대한 권한을 확인하려면 단말기에 다음 명령을 입력합니다.

ls -l <path/to/file>

허가 기호 표기법을 보세요.


5. PHP 설정 확인

위의 어느 것도 동작하지 않는 경우는, PHP 설정에 의해서 그 파일에 액세스 할 수 없게 되어 있는 것이 문제일 가능성이 있습니다.

다음의 3개의 설정이 관련하는 경우가 있습니다.

  1. open_basedir
    • 이 설정을 하면 PHP는 지정된 디렉토리 이외의 파일(심볼 링크를 통해서도)에 액세스 할 수 없습니다.
    • 다만, 디폴트 동작에서는, 제한이 없는 경우는 설정되지 않습니다.
    • 이것은, 전화 또는 를 사용해 확인할 수 있습니다.ini_get("open_basedir")
    • php.ini 파일 또는 httpd.conf 파일을 편집하여 설정을 변경할 수 있습니다.
  2. 세이프 모드
    • 이 옵션을 켜면 제한이 적용될 수 있습니다.단, 이것은 PHP 5.4에서 삭제되었습니다.아직 세이프 모드를 지원하는 버전을 사용 중인 경우 계속 지원되는 PHP 버전으로 업그레이드하십시오.
  3. allow_url_fopen 및 allow_url_fopen
    • 이는 http://와 같은 네트워크 프로세스를 통해 파일을 포함하거나 여는 경우에만 해당되며 로컬 파일 시스템에 파일을 포함하려고 할 때는 해당되지 않습니다.
    • 은 '해 주세요'로 확인하실 수 .ini_get("allow_url_include")으로 설정하다ini_set("allow_url_include", "1")


코너 케이스

위의 어느 것도 문제의 진단에 유효하게 되어 있지 않은 경우는, 다음과 같은 특수한 상황이 발생할 가능성이 있습니다.


1. 인크루드 패스에 의존하는 라이브러리의 포함

상대 경로 또는 절대 경로를 사용하여 Zend 프레임워크와 같은 라이브러리를 포함할 수 있습니다.예를 들어 다음과 같습니다.

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

하지만 여전히 같은 종류의 오류가 발생합니다.

이 문제는 (정상적으로) 인크루드된 파일 자체에 다른 파일의 include 문이 있고 두 번째 include 문은 해당 라이브러리의 경로를 include 경로에 추가한 것으로 가정하기 때문에 발생할 수 있습니다.

예를 들어 앞에서 설명한 Zend 프레임워크 파일에는 다음이 포함될 수 있습니다.

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

상대 경로나 절대 경로에 의한 포함이 아닙니다.Zend 프레임워크 디렉토리가 include 경로에 추가되었다고 가정합니다.

이 경우 include 경로에 디렉토리를 추가하는 것이 유일한 현실적인 해결책입니다.


2. SELinux

Security-Enhanced Linux 를 실행하고 있는 경우는, 서버로부터의 파일에의 액세스를 거부하는 것이 문제의 원인일 가능성이 있습니다.

시스템에서 SELinux가 활성화되어 있는지 여부를 확인하려면sestatus명령어를 지정합니다.SELinux의 SELinux의 SELinux의 SELINux의 SELINUX가 있다.만약 그것이 존재한다면, 그것은 당신에게 그것이 시행되는지 아닌지를 알려줄 것입니다.

SELinux 정책이 문제의 원인인지 여부를 확인하려면 일시적으로 끌 수 있습니다.그러나 이 경우 보호가 완전히 비활성화되므로 주의하십시오.프로덕션 서버에서 이 작업을 수행하지 마십시오.

setenforce 0

SELinux가 꺼진 문제가 해소된 경우 이것이 근본 원인입니다.

문제를 해결하려면 그에 따라 SELinux를 설정해야 합니다.

다음 컨텍스트 유형이 필요합니다.

  • httpd_sys_content_t 수 의 경우.
  • httpd_sys_rw_content_t 및 .
  • httpd_log_t의 경우
  • httpd_cache_t의 경우

를 들어, 「」를 하려면 , 「」를 지정합니다.httpd_sys_content_tdirectory를 실행합니다.

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

이 홈는, 「 」의 「 」도 유효하게 할 .httpd_enable_homedirs 명령어:

setsebool -P httpd_enable_homedirs 1

어쨌든 이유 중 SELinux, 당신의 정책에 따라 대한 부정 할 것이 있을 수도 있다 다양성이다.그래서 당신은 그것을 조사하도록 필요가 있을 것이다.여기에 자습서는 명확하게 웹서버에 SELinux을 구성하고 있다.


3.Symfony

Symfony를할 때 이 수은 Symfony가 원인일 수 있습니다.app/cache

당신과 이 문제를 해결하는 다음 콘솔 명령을 실행하고 테스트할 수 있습니다.

cache:clear


4. 논 항공 통제 대대Zip파일 안에 2세 캐릭터다.

「 」 「 」 「 」 「 」 「 」 「 」를 호출했을 때에도 할 수 .zip->close() 내의 에 ASCzip 의 파일이 있는 "" " "예예예예예예예예예예예예예예예(예: "예")

방법은 the the the the the the the the the the the the the the the로 랩하는 입니다.utf8_decode()대상 파일을 작성하기 전에.

Fran Cano가 이 문제에 대한 해결책을 식별하고 제안해 준 공로를 인정합니다.

(정말 좋은) 기존 답변에 추가

공유 호스팅 소프트웨어

open_basedir는, 할 수 있기 에, 할 수 있는 입니다.전용 서버를 가동하면 간단하게 해결할 수 있지만, 도메인 단위로 설정 디렉티브를 설정하는 공유 호스팅 소프트웨어 패키지(Plesk, cPanel 등)가 몇 개 있습니다. 「」)을 때문입니다.httpd.conf이 파일은, 재기동시에 호스팅 소프트웨어에 의해서 덮어쓰기 되기 때문에, 직접 변경할 수 없습니다.

하면 제공된 PLESK를 수 .httpd.conf라고 하는vhost.conf이 파일은 서버 관리자만 쓸 수 있습니다. 의 은, 이 Apache 와 같습니다.

<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>

서버 관리자에게 사용하는 호스팅 및 웹 서버 소프트웨어의 매뉴얼을 참조하도록 지시하십시오.

파일 권한

웹 서버를 통해 파일을 실행하는 것은 명령줄 또는 cron 작업 실행과는 매우 다르다는 점에 유의하십시오.큰 차이는 웹 서버에 자체 사용자와 권한이 있다는 것입니다.보안상의 이유로 그 사용자는 매우 제한적입니다.들어 Apache는 경우 Apache입니다.apache,www-data ★★★★★★★★★★★★★★★★★」httpd(서양속담, 돈속담) 중인 있는 , 루트로 root의 됩니다).cron은 CLI를 사용합니다.Cron은 Cron 작업 또는 CLI 실행을 실행한다(PHP).

대부분의 경우 사용자는 다음 작업을 수행하여 권한 문제를 해결합니다(Linux 예제).

chmod 777 /path/to/file

파일 또는 디렉토리가 전역 쓰기 가능하므로 이는 현명한 생각이 아닙니다.서버를 소유하고 있는 유일한 사용자라면 이 작업은 그다지 중요하지 않지만, 공유 호스팅 환경이라면 서버 상의 모든 사용자에게 액세스 권한을 부여하기만 하면 됩니다.

필요한 것은, 액세스 할 필요가 있는 유저를 특정해, 그 유저에게만 액세스권을 주는 것입니다.접속이 필요한 사용자를 알게 되면 다음 사항을 확인해야 합니다.

  1. 그 유저가 파일을 소유해, 부모 디렉토리(특히 파일을 쓰는 경우는 부모 디렉토리)를 소유할 가능성이 있습니다.대부분의 공유 호스팅 환경에서는 사용자가 루트 아래에 있는 모든 파일을 소유해야 하므로 이 문제는 발생하지 않습니다.Linux 의 예를 다음에 나타냅니다.

     chown apache:apache /path/to/file
    
  2. 사용자, 그 사용자만이 액세스 할 수단은 그 유저만이 액세스 할 수 있습니다. 를 사용하는 것이 좋습니다.chmod 600 수 ) (읽고 쓸 수 있다)chmod 644쓸 수 은 읽을 수 있습니다

Linux/Unix 권한사용자에 대한 자세한 내용은 여기를 참조하십시오.

  1. 정확한 오류를 보세요.

제 코드는 모든 기계에서 정상적으로 동작했지만, 이 기계에서만 문제가 생기기 시작했습니다(예전에는 문제가 생기기 시작했던 것 같습니다.에코 "document_root" 경로를 사용하여 디버깅하고 오류도 자세히 조사했습니다.

경고: include(D:/MyProjects/testproject//functions/connections.php): 스트림을 열지 못했습니다.

어디에 문제가 있는지 쉽게 알 수 있어요.문제는 기능 전 //입니다.

$document_root = $_SERVER['DOCUMENT_ROOT'];
echo "root: $document_root";
include($document_root.'/functions/connections.php');

따라서 적재/포함 부분을 제거하기만 하면 정상적으로 작동합니다.흥미로운 점은 이 동작은 버전에 따라 다르다는 것입니다.저는 Laptop, Macbook Pro, 그리고 이 PC에서 같은 코드를 실행했는데, 끝까지 모두 정상적으로 작동했습니다.이게 도움이 됐으면 좋겠네요.

  1. 브라우저의 파일 위치를 지나 복사하여 파일이 존재하는지 확인합니다.파일이 예기치 않게 삭제될 수 있습니다(저와 같은 경우).그것도 제 문제였습니다.

Samba 공유

리눅스 테스트 서버를 사용하고 윈도우즈 클라이언트에서 작업하는 경우 Samba 공유가 chmod 명령을 방해합니다.따라서 다음을 사용해도 됩니다.

chmod -R 777 myfolder

Linux 측에서는 Unix Group\www-data가 여전히 쓰기 액세스 권한을 가지고 있지 않을 수 있습니다.Windows 관리자가 root에 매핑되도록 공유가 설정되어 있는 경우 다음 중 하나의 솔루션이 작동합니다.Windows에서 권한을 열고 복사본이 있는 폴더의 상속을 비활성화한 다음 www-data에 대한 전체 액세스 권한을 부여하십시오.

쿼리 매개 변수를 사용하여 스크립트 추가

그건 내 경우였어.실제로는 #4485874에 링크되어 있습니다만, 여기서 간단하게 설명하겠습니다.
「 」를 할 때path/to/script.php?parameter=value 는, 「PHP」를 찾습니다.script.php?parameter=valueUNIX 에서는, 이러한 패스를 사용할 수 있기 때문입니다.
스크립트에 , 이 를 "알겠습니다"라고 .$variable=... ★★★★★★★★★★★★★★★★★」$GLOBALS[]=...아니면 네가 좋아하는 방식으로.

음 settings in の PHP の in php の settings php の PHP の in in 。php.ininon-existent 경우, 「」도 기동할 수 .

PHP 경고:알 수 없음: 스트림을 열지 못했습니다.0행의 알 수 없는 항목에서 사용 권한이 거부되었습니다.

sys_temp_dir
upload_tmp_dir
session.save_path

PHP - 스트림을 열지 못했습니다. mac에 해당 파일 또는 디렉터리가 없습니다.

예를 들어 사진을 올릴 것이다.하지만 이 에러가 발생하고 있습니다.먼저 이미지를 오른쪽 클릭하여 정보를 얻습니다.

$thePathOfMyPicture = "/Users/misstugba/Desktop/";으로

if(move_uploaded_file($_FILES["file"]["tmp_name"],$thePathOfMyPicture.$_FILES["file"]["name"])){
echo "image uploaded successfully";

} 여기에 이미지 설명 입력

이 에러는, 유저명과 패스워드를 포함한 HTTP 인증이 필요한 파일을 읽으려고 하고 있었기 때문에 발생했습니다.그것이 다른 사람들에게 도움이 되길 바랍니다.다른 궁지에 몰린 사건일 수도 있어요

편집

헤더를 검사하는 것으로, 다음의 타입의 인증이 존재하는지를 확인할 수 있습니다.

$file_headers = get_headers($url);
if (!$file_headers) echo 'File headers missing';
else if (strpos($file_headers[0], '401 Unauthorized') > -1) echo '401 Unauthorized';

PHP에서 Apache를 시작한 후 사용자 환경에 DB 이름과 비밀번호(.env)가 있는 경우 기록합니다.

다른 훌륭한 답변 외에도 간단한 스크립트를 작성하면서 Windows에서 간과한 것이 하나 있습니다.이 에러는, Windows 가 파일명에 서포트하고 있지 않는 문자의 파일을 열려고 할 때에 표시됩니다.

예를 들어 다음과 같습니다.

$file = fopen(date('Y-m-d_H:i:s'), 'w+');

제공 내용:

fopen (802-06-01_22:53:03) :스트림을 열지 못했습니다.이러한 파일 또는 디렉터리가...에 없습니다.

가 Windows를 않는다:파일 이름 및 기타 여러 문자로 구성됩니다.

언급URL : https://stackoverflow.com/questions/36577020/php-failed-to-open-stream-no-such-file-or-directory

반응형