За последние 24 часа нас посетили 23500 программистов и 1692 робота. Сейчас ищет 1321 программист ...

Запрет на вызов второй копии скрипта

Тема в разделе "PHP для новичков", создана пользователем Egoritch, 20 сен 2024.

  1. Egoritch

    Egoritch Активный пользователь

    С нами с:
    17 май 2018
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте, уважаемые. Я - не так, чтобы новичок, но сейчас столкнулся с тем, что простая вещь мне не даётся. И Гугл не помог, там решения излишне сложные. Суть такова:
    Понадобилось мне сделать просмотрщик галерей картинок в одном файле. Чтобы его просто закинул в любую папку на сайте и он нормально показывал картинки в этой папке и во всех вложенных. Ну, я в него впихнул и css BootStrap, и простой javascript LightBox типа. Но, как ни крути, превью надо делать и кэшировать. Вот тут и проблема. На сайте может быть много картинок. Чтобы показать превью на странице, у всех у них адреса типа https://сайт/папка/index.php?act=prev&path=./путь-к-реальной-картинке.jpg . Обратите внимание на параметр act. Если этот же скрипт вызывается с ним, то он или ищет превью, или генерирует. Причем, генерация - это нагрузка на сервак, поэтому мне нужно, чтобы если скрипт вызывается с act-параметром "prev", то одновременно с ним уже ничего бы не генерировалось. Дальше сделано тоже просто. При таком запросе я создаю файл и после отработки - удаляю. А если файл такой есть -- чуточку жду и снова пробую.
    Код (Text):
    1.     $flagFile=true;
    2.     while ($flagFile==true){
    3.         $flagFile=file_exists("flagfile.txt");
    4.         if ($flagFile==true)usleep(rand(230000, 700000));
    5.     }
    6.     $handle = fopen("flagfile.txt", "w");
    7.     $somecontent = "Отрабатывается скрипт...\n";
    8.     fwrite($handle, $somecontent);
    9.     fclose($handle);
    Вот, если сюда заходит, то проверяется наличие превью. И или делается
    Код (Text):
    1. header("location
    на это превью, или создается превьюшка и потом производится перенаправление. Два варианта.
    Перед перенаправлением, понятно, делается
    Код (Text):
    1. unlink('flagfile.txt');
    .
    Выглядит всё просто, но что-то идёт не так. Стопиццот ошибок 518, типа "обнаружен бесконечный цикл" или "превышена нагрузка на сервер.
    Что я делаю не так, почему не работает? Несколько часов уже сижу. Не критично, но всё же...
    Буду очень благодарен за помощь!
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.844
    Симпатии:
    744
    Адрес:
    Татарстан
    ппц просто....
    про кеширование не слышали?

    в вашем случае кратко - при вызове с act=prev в скрипте смотрите - а нет ли у нас уже превьюшки сгенерированой?
    если есть - отдает именно ее, ничего не надо повторно генерить
    ну а если нет - значит еще не генерировали - смело генерьте и отдавайте

    надеюсь вы превью в файл генерите... а не динамически на каждый чих?
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.818
    Симпатии:
    648
    Добавлю, что путь к превьюшке должен быть обычным адресным путем, тогда сам Web-сервер будет ее отдавать, когда она физически присутствует. А когда ее нет, управление будет передаваться в скрипт генерации.
    --- Добавлено ---
    P.S. Генерация выполняется во временной папке под временным именем, а потом файл перемещается на постоянное место с постоянным именем. Перемещение нужно делать в пределах одного диска. По крайней мере в нашей конторе я видел только такой вариант.
     
  4. Egoritch

    Egoritch Активный пользователь

    С нами с:
    17 май 2018
    Сообщения:
    9
    Симпатии:
    0
    Уважаемый ADSoft, я просто не написал, но конечно же, у меня в начале стоит
    Код (Text):
    1. if ($_GET['act']=="prev"){
    2.        ... ... ...
    3.        if (file_exists($prevFile)){
    4.         header("Location: ".$prevFileWeb, 0); exit();
    5.        }
    6. }
    И только потом, если нет такого файла, проверяется структура директорий для превьюшки (если надо - создаются папки) и создаётся превьюшка. Она помещается в нужную папку в превью-дереве и в следующий раз на неё сразу пройдёт переадресация.
    И вот, если скрипт запускается в первый раз и превьюшек пока или нет вообще или почти нет, происходит то, что я описал. 518. Мне надо как-то отследить, что сейчас генерится одна превьюшка и чуточку подождать.
    miketomlin, "путь к превьюшке должен быть обычным адресным путем, тогда сам Web-сервер будет ее отдавать, когда она физически присутствует. А когда ее нет, управление будет передаваться в скрипт генерации.". Нет, я не могу сразу путь к превьюшке ставить. Потому что задумка в том, что просмотрщик в одном файле. Без джава-скриптов, css и прочего. То есть, .htaccess я тоже не могу править (чтобы при 404 у превьюшки запрос отдавался бы файлу генерации).
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.844
    Симпатии:
    744
    Адрес:
    Татарстан
    поверьте - не нужно.... это вы так думаете.. классическая проблема XY

    В зависимости от полного понимания вопроса решения могут быть различны, например:
    - изображения загружаются через скрипт/админку/апи .. то есть программно - решение: генерить превьюшку одновременно с загрузкой
    - изображения загружаются хз как... или просто они там есть и особо не пополняются - решение: генерить превьюхи разово/по расписанию перебирая все в каталоге
    итд итп ...попробуйте сформулировать адекватно текущую ситуацию и проблему
     
  6. Egoritch

    Egoritch Активный пользователь

    С нами с:
    17 май 2018
    Сообщения:
    9
    Симпатии:
    0
    ADSoft, я уже решил, в другом месте посоветовали. Банальный lazy load. И всё отлично работает. Просмотрщик получился отличный. И вам спасибо за попытку помочь!
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.818
    Симпатии:
    648
    Это вообще не проблема при использовании современного подхода к построению сайта. Это все выводится через «один файл» (единую точку входа):
    g09.ru/index.html
    g09.ru/sexygirl.jpg
    g09.ru/sansfont.png

    А редирект там, где он не нужен, – зло!
     
  8. Egoritch

    Egoritch Активный пользователь

    С нами с:
    17 май 2018
    Сообщения:
    9
    Симпатии:
    0
    Я, к сожалению, не знаю, как это делать без дополнительного файла.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.818
    Симпатии:
    648
    Понятно :( Хотя бы на досуге почитайте, как сейчас работает большинство сайтов. Ключ для поисков я упомянул. В принципе у Вас, если я правильно понял, что-то похожее (act=prev). Только уже давно принято использовать более нативные адреса, где путь играет основную роль, а строка параметров вспомогательную. Причем уже давно нативные адреса не транслируют в технические вроде вашего, а разбирают их сразу в единой точке входа.
    --- Добавлено ---
    Как сделать единую точку входа с ЧПУ?
     
  10. Egoritch

    Egoritch Активный пользователь

    С нами с:
    17 май 2018
    Сообщения:
    9
    Симпатии:
    0
    Спасибо за ссылку, но боюсь, что вы не поняли. Мне нужен был такой просмотрщик, чтобы его можно было кинуть на любой сайт. Который неизвестно кто строил и настраивал. И чтобы всё сразу работало. Без настройки .htaccess , Апача, nginx и т. п. Даже не трогать их. Чтобы в каких-то завалах Images или Uploaded можно было быстро всё просмотреть. У меня чуть меньше 40 корпоративных сайтах. Создавались на протяжение многих лет на чём попало. Несколько хостингов. Плюс часто просят помочь. И мне понадобился такой вьювер, all-in-one. Была одна проблема, с которой я создал тему на форуме. Но в другом месте подсказали, как её обойти.
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.818
    Симпатии:
    648
    Да, «кинуть на сайт» – это не наш метод :) Но в принципе все подкручивается. И лучше постепенно прикручивать более современные штуки, пытаясь со временем все свести воедино, чем разводить еще больший зоопарк. Ну, ладно, у каждого свой путь.