2010-06-25 9 views
19

Mam zadanie cron, który musi zawierać ten plikPHP: Wymagaj ścieżki nie działa dla zadania cron?

require '../includes/common.php'; 

jednak, gdy jest prowadzony przez cron (a nie mojego lokalnego testowania), względna ścieżka nie działa. zadanie cron działa następujący plik (na żywo serwera):

/home/username123/public_html/cron/mycronjob.php 

i tu jest błąd:

Fatal error: require(): Failed opening required '../includes/common.php' 
(include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/username123/public_html/cron/mycronjob.php on line 2 

użyciu tego samego formatu bezwzględnej jako crona common.php będzie położony na

/home/username123/public_html/includes/common.php 

to znaczy muszę wymienić moje linii 2 z:

require '/home/username123/public_html/includes/common.php'; 

?

dziękuję!

+0

możliwe duplikat [ścieżka względna nie pracuje w cron skrypt php] (http://stackoverflow.com/questions/1969374/relative-path-not-working-in-cron-php-script) –

+1

try: chdir (__ DIR__); od: [http: // stackoverflow.com/pytania/5254000/php-how-to-set-current-robocza-katalog-to-be-same-as-katalogu-wykonującego-the] [1] [1]: http://stackoverflow.com/questions/5254000/php-how-to-set-current-working-directory-to-be-same-as-directory-executing- –

Odpowiedz

22

Z technicznego punktu widzenia skrypt php jest uruchamiany tam, gdzie znajduje się cron; dawny. Jeśli cron był w/bin/cron, to ta instrukcja wyszukałaby common.php w /bin/includes/common.php.

Więc tak, prawdopodobnie będziesz musiał użyć fullpaths lub użyj set_include_path

set_include_path('/home/username123/public_html/includes/'); 
require 'common.php'; 
+0

, aby ułatwić debugowanie, czy mogę powiedzieć: \t if (file_exists ('/ home/username123/public_html/includes/common.php')) { \t \t set_include_path ('/ home/username123/public_html/includes /'); \t \t wymagają "common.php"; \t} else \t \t wymagają "../includes/common.php"; czy trzeba to ręcznie zmienić za każdym razem i zrób to: \t // NA ŻYWO \t set_include_path ('/ home/fini7463/public_html/includes /'); \t wymagają "common.php"; \t // DEBUG \t // wymaga "../includes/common.php"; ? – gsquare567

+0

Zgaduję, że pierwsza powinna być w porządku – Robus

20

nono. musisz używać bezwzględnych ścieżek na cronach.

co mogę zrobić, to:

// supouse your cron is on app/cron and your lib is on app/lib 
$base = dirname(dirname(__FILE__)); // now $base contains "app" 

include_once($base . '/lib/db.inc'); 

// move on 
+1

Nie, ty nie ... ale musisz pozwolić na to, że możesz być uruchomiony w innym katalogu i z inną ścieżką include_path –

+0

tak, masz rację, myślę, że lepszym sformułowaniem może być * zalecany * zamiast * potrzebny *. cóż, zawsze staram się to robić –

+0

To powinna być zaakceptowana odpowiedź – karancan

0

Jeżeli względna ścieżka nie działa, to znaczy, że obecny zestaw katalog kiedy zadania cron jest uruchomiony nie jest/home/username123/public_html. W takich przypadkach można użyć wyłącznie ścieżki bezwzględnej.

0

Brzmi to tak prosto, jak tylko niektóre z uruchomionych skryptów ustawiają ścieżkę include i włączasz ten skrypt. użyj funkcji phpinfo(), aby sprawdzić ustawienie globalne include_path względem lokalnego.

0

Alternatywą dla rozwiązań zalecających bezwzględną specyfikację ścieżki jest użycie w skrypcie kodu chdir. W ten sposób Twoje względne ścieżki będą działać zgodnie z oczekiwaniami.

Na przykład, aby przejść do katalogu skryptu:

$curr_dir = dirname(__FILE__); 
chdir($curr_dir); 

Aby przejść do katalogu nadrzędnego skryptu:

$curr_dir = dirname(__FILE__); 
chdir($curr_dir . "/.."); 

i tak dalej.