2011-01-18 5 views
1

Я пытаюсь создать простой журнал ошибок, которые записывают ошибки php, если они не могут быть отправлены администратору (с подключением к базе данных). Я написал это:Разрешение отклонено, журнал ошибок

function errorLog($array) 
{ 
    $time = date("F j, Y, g:i a"); 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $no = $array['e-no']; 
    $string = $array['e-string']; 
    $file = $array['e-file']; 
    $line = $array['e-line']; 
    $context = $array['e-context']; 

    $string = "TIME {$time} IP {$ip} ERROR {$no} | {$string} | {$file} | {$line} | {$context}"; 
    if ($handler = fopen('log/log-file.txt', 'a')) 
    { 
     fwrite($handler, $string); 
     fclose($handler); 
    } 
    else 
    { 
     exit('Fatal Error #0002'); 
    } 
} 

START EDIT

Функция была стала

function errorLog($array) 
{ 
    $time = date("F j, Y, g:i a"); 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $type = $array['e-type']; 
    $string = $array['e-string']; 
    $file = $array['e-file']; 
    $line = $array['e-line']; 
    $context = $array['e-context'] 
    $string = "ON {$time} IP {$ip} ERROR {$type} | {$string} | {$file} | {$line} | {$context}"; 
    if (!error_log($string, 3, 'log/log-file.txt')) { exit('Fatal Error #0002'); } 
} 

END EDIT

Но когда я запускаю его я получаю

Warning: fopen(log/log-file.txt) [function.fopen]: failed to open stream: Permission denied in myfile.php on line 17 

У меня проблема с разрешением сервера, но я работаю над локальным хостом (Xampp on Mac os x), и мне бы хотелось управлять этими разрешениями. Как я могу разместить журнал/только для записи? Есть ли лучшие способы делать то, что я пытаюсь сделать?

+3

Не решить проблему, но вы можете прочитать функцию error_log. что может немного упростить ваш код? – Nanne

+0

Прочтите, спасибо. – Shoe

+2

создайте этот файл журнала вашим ftp-клиентом и установите для него 666 разрешений –

ответ

7

Я получил это проблема разрешения сервера, но я работаю на локальном хосте (Xampp на Mac OS х) и я хотел бы, чтобы управлять этими разрешениями. Как я могу разместить журнал/только для записи? Есть Есть ли лучшие способы делать то, что я пытаюсь сделать?

Возможно, вы захотите проверить set_error_handler, чтобы все ошибки были автоматически отправлены через вашу пользовательскую функцию. Во всяком случае, это не источник вашей проблемы, ваша проблема на самом деле - это разрешения на сервере. Теперь первое, что нужно сделать, это определить, как работает пользовательский PHP. Это может быть очень просто определить, нужно просто запустить этот скрипт:

<?php 
echo `whoami`; 

В случае вашего Mac, который, вероятно, является «WWW-данные». Если вы хотите изменить это (возможно), вы должны понять, как работает (f.e.) Apache MPM ITK. Если у вас все в порядке с «www-data», запускающими ваши скрипты, вы должны предоставить доступ к «www-data» в каталог журнала. Сначала перейдите в родительский каталог и выполните команду ls -laF, чтобы просмотреть подробную информацию о каталоге журнала. Скажем, вывод заключается в следующем:

rwxr-хт-х 2 ягодных ягодный 4096 2011-01-18 16:53 Журнал/

В этом случае я (пользователь «ягода»), буду владелец. Группа, в которой я в основном работаю (а именно, «ягода»), - это группа, которая владеет каталогом. Теперь вы можете сказать rwx r-x r-x, что владелец (первый rwx) может читать, писать и исполнять. Вторая (группа) может читать и выполнять. Остальные (все остальные) могут читать и исполнять.

«www-data», вероятно, не входит в группу «ягода». Чтобы исправить это, вы хотите выдать команду: chgrp -R www-data log/, а затем chmod -R g+x log/. Это означает: изменить группу владельца на «www-data» и предоставить группе (g) разрешение на выполнение (+ x), сделать это рекурсивно (-R) в каталоге «log /».

Удачи.

+1

Я оценил этот ответ, но я решил свою проблему, просто создав этот файл и предоставив ему разрешение 666. Кстати, этот ответ может быть полезен для всех, поэтому я приму его. – Shoe

+0

Не правильный вызов "echo exec ('whoami');"? – Andrija

+1

@Andrija Зависит от того, что вы называете правильным. Выходы Backticks и exec будут иметь тот же результат. –

Смежные вопросы