Göreli yol cron PHP komut dosyası çalışmıyor

7 Cevap php

Göreli yollar kullanılır eğer bir PHP komut dosyası bir cron dosyası olarak çalıştırılırsa, içerir genellikle başarısız olur. Örneğin, varsa

require_once('foo.php');

Komut satırından çalıştırmak, ama ne zaman bir cron komut çalıştırdığınızda dosya foo.php bulunacaktır.

Bunun için tipik bir geçici çözüm çalışma dizinine ilk İşlevin için, ya da mutlak yollarını kullanın. Ben bilmek istiyorum, ancak, ne cron ve bu davranışa neden olan kabuk arasında farklıdır. Bir cron komut göreli yolları kullanırken neden başarısız?

7 Cevap

Bir cron çalıştırdığınızda komut dosyası çalışma dizini farklı olabilir. Ek olarak, PHPs çalışma dizini gerçekten sorun olma konusunda karışıklığa neden olan) (require () ve dahil ilgili bazı karışıklıklar oldu:

include('foo.php') // searches for foo.php in the same directory as the current script
include('./foo.php') // searches for foo.php in the current working directory
include('foo/bar.php') // searches for foo/bar.php, relative to the directory of the current script
include('../bar.php') // searches for bar.php, in the parent directory of the current working directory

Ben aynı zamanda cron ve apache ile çalışmak "require_oncenin" got tek şansıydı

require_once(dirname(__FILE__) . '/../setup.php');

Zati bir cron işi çalıştırıldığında, kabuktan elle başlatmak eğer PHP komut muhtemelen farklı bağlamında çalışır. Yani göreli yollar doğru yolu işaret değildir.

Benim canlı site sunucusu farklı bir yol var gibi benim localhost üzerinde çalışmaz rağmen DIR çalışır. Bunu düzeltmek için bu kullanılır.

    if(__DIR__ != '/home/absolute/path/to/current/directory'){ // path for your live server
        require_once '/relative/path/to/file';
    }else{
        require_once '/absolute/path/to/file';
    }

Cron işleri için "geçerli çalışma dizini" sizin crontab dosya var dizin olacak çünkü - yani herhangi bir göreli yollar bu dizine göreli olarak.

Bu işlemek için basit yolu dirname () fonksiyonu ve PHP dosyası sabiti ile. Farklı bir dosya yapısına sahip, farklı bir dizin veya bir sunucuya dosya taşımak Aksi durumda, yeni mutlak yolları ile dosyayı düzenlemek gerekir.

dirname( __FILE__ )

Not: nedeniyle biçimlendirme motoru dosya sabit bold işlenir ediliyor. Gördüğünüz her Yani FILE gerçekten anlama gelir:

__FILE__

FILE denir hangi dosyanın tam yolu olarak PHP tarafından tanımlanan bir sabittir. Dosya dahil olsa bile, FILE daima dosyasının kendisini tam yoluna sevk edecektir - dosya dahil yapmıyorum.

Ondan denir hiçbir mater - Yani dirname (FILE) dosyasını içeren dizine tam dizin yolunu döndürür.

example: Let's pretend "/home/user/public_html/index.php" includes "/home/user/public_html/your_directory/your_php_file.php".

Eğer dirname ararsanız (FILE) in "your_php_file.php" almak istiyorum "/ home / user / public_html / your_directory" Etkin komut dosyası "/ home / user / public_html" (not olsa bile döndü firar yokluğu) kesiyorsun.

Eğer AKTİF dahil olmak üzere dosya kullanım dizini gerekirse:

dirname( $_SERVER['PHP_SELF'] )

"/ home / user / public_html" dönmek ve göreli yolları aynı olduğu "index.php" dosyasında (FILE) dirname çağrı olarak aynı hangi.

kullanımları:

@include dirname( __FILE__ ) . '/your_include_directory/your_include_file.php';

@require dirname( __FILE__ ) . '/../your_include_directory/your_include_file.php';

Çalışan dosya yoluna çalışma dizinini değiştirin. Kullanmadan hemen

chdir(dirname(__FILE__));
include_once '../your_file_name.php'; //we can use relative path after changing directory

çalışan dosyasında. Sonra her sayfada mutlak yollara tüm göreli yollarını değiştirmek gerekmez.

Diğer bir olasılık da, farklı bir versiyonu CLI php.ini dosyası kullanarak olmasıdır. (Varsayılan olarak, php-cli.ini kullanacağız ve standart php.ini çare)

Eğer kullanıyorsanız. Htaccess dosyaları kütüphane yolunu, vb ayarlamak için de, bu besbelli cli aracılığıyla çalışmaz.