Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
ИмяПользователя
24 / 22 / 16
Регистрация: 02.04.2015
Сообщений: 222
1

Совместная работа с файлом и ошибка Permission denied

21.07.2016, 11:50. Просмотров 961. Ответов 3
Метки нет (Все метки)

Доброго дня, уважаемый All.
Растолкуйте, пож., как на php (5.5) "корректно" работать с одним фалом из 2х разных программ?

Кратко суть: есть старая exe программа (соответственно ОС Win), которая работает с прибором и постоянно перезаписывает файл-состояния этого прибора (небольшой текстовый документ в csv формате). Подробнее: при изменении состояния хоть одного из показателей (их порядка 20ти), программа перезаписывает файл с новым состоянием. Частота обновления самая разная и совершенно непредсказуемая (может и 20 раз в секунду переписать, а может 2-3 суток простоять в одном состоянии).

К этому добру пишу скрипт на php, в котором хочу открыть файл на чтение, считать из него содержимое в "текущую" переменную, если содержимое текущей не равно сдержанию "предыдущей" - записать параметры в БД, уравнять предыдущую с текущей, обождать пол секунды, повторить.

В принципе - написал и даже "всё работает". По причине говнокода тут выкладывать не стану, смущает только 1 момент: регулярно, при организованном мной подходе, возникает предупреждение "Permission denied" при попытке обращения к файлу-выгрузке. Подозреваю дело в том, что в этот самый момент, этот самый файл открыт exe-программой для записи/перезаписывается.

Мне по задаче не страшно, если я сниму показатели не 2 раза в секунду, а 1 раз в 2-3 секунды, т.е. задачи "обязательно открыть файл" - не стоит. Вопрос скорее в том: как считать содержимое файла в случае его доступности, и не выводить варнинга при отказе? Глобально подавлять вывод об ошибках не хочется.

Сейчас открытие и считывание у меня организовано так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Проверка существования файла
if(file_exists(data_file_path.ActivSpeed)){
    // Была хрупкая надежда, что если обернуть file_get_contents() в try/catch,
    // то удастся локально подавить вывод Warning'a
    try{
        $f = trim(file_get_contents(data_file_path.ActivSpeed));
    }catch (Exception $e){
        // Еще один костыль, возникший из моего недопонимания происходящего.
        // Кроме того, что файла может не быть доступен или его может не существовать в момент
        // перезаписи - он еще и может стать пустым, это "нормаьлное" состояние в некоторых случаях
        $f = false;
    }
    // Необходимо обработать и пустой файл. Если просто сделать:
    // $f = trim(file_get_contents(data_file_path.ActivSpeed)) пустого файла в него ляжет 0,
    // а 0 не пройдет проверку if(), поэтому пытаюсь проверять через "строгое" сравнение
    if($f !== false){
        if($lastActive != $f){
        // Собственно - дальше не важно, дальше тоже много говнокода, но он, по крайней мере, работает
        // и пока что устраивает "как" работает
Вопрос именно в корректном открытии/считывании - как правильно организовать проверку, что бы не получать постоянных Permission denied?

Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2016, 11:50
Ответы с готовыми решениями:

При удалении файла ошибка Permission denied
У себя на сайте сделал страницу софта , файлы загружаются, в базу данные забиваются и удаляются ,...

"Failed to open stream: Permission denied", где ошибка?
Есть скрипт ротатора банеров. На денвере работает без ошибок. На хостинге после запуска скрипта...

Unlink permission denied
Всем привет! При попытке удалить загруженные на сервер фото выдается ошибка Warning:...

Warning: mkdir(): Permission denied in
пытаюсь с помощью скрипта создать директорию и мне высвечивает ошибку "Warning: mkdir(): Permission...

File_get_contents(): failed with errno=13 Permission denied
Всем привет. Требуется вытащить данные с федерального сайта открытых данных data.gov.ru. Там есть...

3
Max Dark
шКодер самоучка
1992 / 1760 / 869
Регистрация: 09.10.2013
Сообщений: 3,887
Записей в блоге: 6
Завершенные тесты: 2
21.07.2016, 12:00 2
Лучший ответ Сообщение было отмечено ИмяПользователя как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
const DEBUG = false; // выставить true при отладке
 
error_reporting(DEBUG ? E_ALL : 0);
ini_set('display_errors', DEBUG ? 'on' : 'off');
 
// переводим ошибки в исключения
set_error_handler(function ($err_no, $err_str, $err_file, $err_line) {
    throw new ErrorException($err_str, 0, $err_no, $err_file, $err_line);
});
 
// Проверка существования файла
if(file_exists(data_file_path.ActivSpeed)){
    $f = false;
    try{
        $f = trim(file_get_contents(data_file_path.ActivSpeed));
    }catch (ErrorException $e){
    }
    if($f !== false){
        if($lastActive != $f){
        // Собственно - дальше не важно, дальше тоже много говнокода, но он, по крайней мере, работает
        // и пока что устраивает "как" работает
1
Пифагор
Модератор
1359 / 1093 / 569
Регистрация: 10.01.2015
Сообщений: 3,666
21.07.2016, 12:04 3
Лучший ответ Сообщение было отмечено ИмяПользователя как решение

Решение

Цитата Сообщение от ИмяПользователя Посмотреть сообщение
Вопрос именно в корректном открытии/считывании
Мне кажется, дополнительная проверка на is_readable() тут будет самая уместная и правильная.
Можно даже вместо file_exists(), поскольку is_readable() проверяет и существование, и доступность для чтения.
1
ИмяПользователя
24 / 22 / 16
Регистрация: 02.04.2015
Сообщений: 222
22.07.2016, 00:18  [ТС] 4
Цитата Сообщение от Пифагор Посмотреть сообщение
Мне кажется, дополнительная проверка на is_readable() тут будет самая уместная и правильная.
- Вот! Спасибо - банально не знаю библиотечных функций акромя совсем уж тривиальных... Вроде и поиском умею пользоваться, но не нагуглил((

Еще раз спасибо, теперь точно "всё"! ))
0
22.07.2016, 00:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2016, 00:18

Failed to open stream: Permission denied
Как бороться с ошибкой? Права на файлы следующие: rw-rw-r--. Владелец rayzor. Сервер работает от...

File_put_contents Failed to open stream Permission denied in
Всем привет :) Больно не пинайте - поиском пользовался, гуглом тоже, даже с хостером решали...

Не работает imap_open: Can't connect to pop.yandex.ru,110: Permission denied
Братья, сестры. Есть 2 варианта простого скрипта подключения к pop3.yandex.ru 1) $mbox =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru