| |
|
|
| | Жду ответа на ранее заданный вопрос (http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=27767&page=1), но толи вопрос задан не удачно, толи таким сервисом среда РНР не обладает. Повторю кратко:
Пользователь загружает файл с сервера, а со стороны администратора требуется замена этого файла новой версией. Как узнать, что файл занят и дождавшись его освобождения, обновить? | |
| |
|
|
|
| |
автор: Глинтвейн (16.11.2006 в 15:47) |
|
| |
для: sim5
(16.11.2006 в 15:42)
| | | Что значит занят? Загружается в данный момент? Если так, то возможности отследить закончена загрузка или нет нельзя. как вариант, можно записывать время последнего обращения к фалу, и исходя из этого, решать докачали его или нет. Но тут опять же есть вариант использования менеджера закачки на диалапе. | |
| |
|
|
| |
|
|
| |
для: Глинтвейн
(16.11.2006 в 15:47)
| | | Функции подобные по ссылке http://ru2.php.net/is_writable дают только информацию о том, доступен файл для записи или нет. Если бы, к примеру, при обращении к файлу ему автоматом выставлялось ФАЙЛ НЕ ДОСТУПЕН ДЛЯ ЗАПИСИ, то и вопроса бы небыло.
К чему все это? Файл большой. Я не могу оборвать его закачку со стороны, только лишь потому что это мне нужно. Узнавать дату выход, но если (теоретически), его начнет одновременно закачивать другой пользователь... Что в РНР - e404 одно единственное универсальное средство, тогда это как в армии мазь Вишневского. | |
| |
|
|
| |
|
|
| |
для: sim5
(16.11.2006 в 16:02)
| | | Два раза перечитал оба сообщения. Нифига не понял. | |
| |
|
|
| |
|
|
| |
для: Loki
(16.11.2006 в 16:13)
| | | Мне нужно обновить файл его новой версией. Размер файла большой. Его загружают. Я ведь не могу начать его перезапись в то время когда он загружается. Как сделать это корректно не создавая кофликтов? | |
| |
|
|
| |
|
|
| |
для: sim5
(16.11.2006 в 16:20)
| | | Есть специальные режими блокировки, для таких случаем (рекомендательная и жесткая). Возможен вариант, что когда начинается считывание -- ставится блокировка на запись, как только она заканчивается, то начинается запись в файл, с блокировкой на чтение. Эти режимы позволяют выводить диагностические сообщения пользователю.
Посмотрите в мануале:
http://ru2.php.net/flock
Имейте в виду, функция имеет много тонкостей. Отладить скрипт с использованием блокировки трудно, и, к сожалению, частенько обнаруживаешь ошибки уже при работе пользователей со скриптом. | |
| |
|
|
| |
|
|
| |
для: mishaMC
(16.11.2006 в 16:28)
| | | Вот из мануала о flock:
· LOCK_SH (или 1) - разделяемая блокировка;
· LOCK_EX (или 2) - исключительная блокировка;
· LOCK_UN (или 3) - снять блокировку;
· LOCK_NB (или 4) - эту константу нужно прибавить к одной из предыдущих,
если вы не хотите, чтобы программа подвисала на
flock() в ожидании своей очереди, а сразу возвращала
управление.
Все хорошо, но ведь я устанавливаю блокировку? Я о чем и спрашиваю. Я если я сходу повешу flock на занятый файл, не произойдет ли его блокировка для пользователя, другими словами - не будет ли блокирован уже запущенный процесс. К примеру в среде Windows API, я могу предопределить реакцию на все (или почти на все случаи), понимаю что сервер это не мой комп с Windos, но ведь как то и в нем долны предусматриваться исключения конфликтов.
К сожалению не все мануалы хороши, покрайней мере, те что у меня раньше были. Из отрывка приведенного выше можно понять, что это можно "есть", но о последствиях ни слова.
Скачал по советам этого форума хорошие доки. Но все хорошее в PDF - и смотреть не удобно, и поиск оставляет желать лучшего, а еще хуже ДЕЖАВЮ. Начал переделывать все в CHM, для себя, но работа не одного дня, а ответ нужен сейчас. Я не могу проводить эксперементы на стороне сервера. Сейчас дома 5 компов оказалось к счастью, три зацепил в сеть, и останется только, изучать весь мануал с помощью эксперементов, если не получу на форуме ответа на вопрос. | |
| |
|
|
| |
|
|
| |
для: mishaMC
(16.11.2006 в 16:28)
| | | Вообще-то, если в процессе выполнения скрипта будет необходимость открыть/записать файл, который будет заблокирован flock(), то интерпритатор PHP просто подождет, пока он освободится, а не выдаст ошибку. | |
| |
|
|
| |
|
|
| |
для: sim5
(16.11.2006 в 16:20)
| | | Как загружают? PHP-скриптом через форму?
К моменту, когда скрипт начнет работу, файл уже будет полностью загружен. | |
| |
|
|
| |
|
|
| |
для: Trianon
(16.11.2006 в 17:02)
| | | Ни че не понимаю, причем здесь upload.
Ну последний раз. Судя по сленгу многих авторов этого форума - вы довольно молоды, если сравнивать с моим возрастом, память у вас лучше, вам и карты в руки. Я конечно еще не страдаю старческим маразмом, но новое запомнить сложнее, поэтому без комментариев "стороны мануала". К примеру, всю компьтерную грамотность, я приобретал сам, начиная с самого низкого уровня, как и многие на примере КР580ВМ80. Досих пор я помню шестнадцатеричный код многих его команд. Легко освоил поэтому контроллеры и много делал вещей на их базе. С раннего детства занимаюсь электроникой, а наш регион сплошь катается на подержанных японках - несут в ремонт кучу всякой бортовой автоэлектроники, и ни кахих проблем, и негорюю что схем нет. Давно занимаюсь программированием, но на локальной машине под ее OS. Сам по образованию художник - занимаюсь графикой и видео.
Ну это все опыт преобретенный за много лет, и с самых азов. А в "приятный омут РНР" окунулся недавно, и ксожалению плюхнулся в самую его середену. К частью выбираса не хоцется!
К сожалению иногда не можешь понять и решить некотурю казалось бы простую вещь, или может это просто излишние требования?
Да... Почти неоконченное "Война и мир", ну да ладно. Вот задача:
На странице отображается -
Вот такой фал <a href="там то">Загрузить</a>
Увидели, обрадовались, грузят. А тут злобный админ решил, что качают не то, жмет у себя кнопочку и закачивает себе на сервер ТО. Закачал и задумался (он хоть и злобный админ, но вежливый) - что сейчас делать, если кто-то еще не забрал себе это НЕ ТО, да еще кто-то занес палец на <a>Загрузить</a>? А дальше варианты как в 50/50:
1. плюнуть на всех, удалить НЕ ТО и поместить на его место ТО ЧТО НАДО,
2. не думая ни о чем, повесить замок - а на что его вешать? Старое надо же просто выбросить и положить новое.
3. как то узнать, что уже скачали, и без матов в окне IE, сообщить тому кто занес свой пальчик над <a>Загрузить</a> - пусть мол пока чайку отведает.
Вот такое можно сделать, или не взирая ни на что, грузить новое, сразу выкидывать старое и на его место ложить новое. Как длинно и не стройно, но я не Пушкин, хотя и фамилия моя его в его родословной имеется. Вот такая вот байка уважаемые. | |
| |
|
|
| |
|
|
| |
для: sim5
(16.11.2006 в 17:57)
| | | >Вот такой фал <a href="там то">Загрузить</a>
Встречный вопрос: а php тут каким боком? | |
| |
|
|
| |
|
|
| |
для: Loki
(17.11.2006 в 09:46)
| | | Потому что принимается решение на стороне сервера. Ну можно другим боком - как безопасно удалить файл на сервере (с целью замены), если он в это время загружается с сервера. | |
| |
|
|
| |
|
|
| |
для: sim5
(17.11.2006 в 16:23)
| | | Отдавайте файл через скрипт. И будет он тогда занят пока его качают... | |
| |
|
|
| |
|
|
| |
для: Loki
(17.11.2006 в 16:57)
| | | Это уже ближе, отдавая его через скрип я знаю что его заняли, а как узнать что он освободился, мне ведь надо его удалить? | |
| |
|
|