PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (21): « 1 [2] 3 4 5 6 7 8 9 ... » В конец

> Найдено сообщений: 305
nkl Отправлено: 26 Февраля, 2015 - 13:40:02 • Тема: Решение нестандартных задач на Symfony • Форум: CMS и фреймворки

Ответов: 6
Просмотров: 1978
Ну что, ни у кого нет мыслей на этот счет? Если не хватает данных или я непонятно объяснил задачу, спрашивайте, отвечу более подробно.
nkl Отправлено: 26 Февраля, 2015 - 11:37:48 • Тема: Решение нестандартных задач на Symfony • Форум: CMS и фреймворки

Ответов: 6
Просмотров: 1978
Всем привет. Давеча я создавал тему, в которой жаловался на этот фреймворк. В частности, на способность решения нестандартных задач. и пользователь digi обещал помочь в решение этих самых задач. Так вот собственно задача возникла. Нужно создать админ-интерфейс для управления комментариями оставленными на сайте.

Вот код админ класса генерированный командой sonata:admin:generate:
PHP:
скопировать код в буфер обмена
  1.  
  2. class InCommentsAdmin extends Admin
  3. {
  4.         public $baseRouteName = 'Комментарии';
  5.         public $baseRoutePattern = 'comments';
  6.         public $translationDomain = 'comments';
  7.         /*protected $formOptions = array('validation_groups' => array(), 'cascade_validation' => true);
  8.         protected $datagridValues = array(
  9.                 //'_page' => 1,
  10.                 '_sort_order' => '', // sort direction
  11.                 '_sort_by' => 'rated DESC, id ASC' // field name
  12.         );*/
  13.        
  14.     /**
  15.      * @param DatagridMapper $datagridMapper
  16.      */
  17.     protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  18.     {
  19.         $datagridMapper
  20.             ->add('id')
  21.             ->add('text')
  22.             /*->add('leftKey')
  23.             ->add('rightKey')
  24.             ->add('level')
  25.             ->add('answerFor')
  26.             ->add('createdDt')
  27.             ->add('published')
  28.             ->add('deleted')
  29.             ->add('editDt')
  30.             ->add('editReason')
  31.             ->add('authorGuestName')
  32.             ->add('originalText')
  33.             ->add('objectType')
  34.             ->add('objectId')
  35.             ->add('branchEditDt')
  36.             ->add('rootId')
  37.             ->add('ip')*/
  38.         ;
  39.     }
  40.  
  41.     /**
  42.      * @param ListMapper $listMapper
  43.      */
  44.     protected function configureListFields(ListMapper $listMapper)
  45.     {          
  46.         $listMapper
  47.                         ->add('commentAuthor','string',array(
  48.                                 'template' => '***AdminBundle:Admin:list_comment_author.html.twig',
  49.                         ))
  50.                         ->add('author')
  51.             ->add('text')
  52.             ->add('createdDt')
  53.             ->add('published')
  54.             ->add('deleted')
  55.             ->add('editDt')
  56.             ->add('editReason')
  57.             ->add('originalText')
  58.             /*->add('objectType')
  59.             ->add('objectId')*/
  60.             ->add('_action', 'actions', array(
  61.                 'actions' => array(
  62.                     'show' => array(),
  63.                     'edit' => array(),
  64.                     'delete' => array(),
  65.                 )
  66.             ))
  67.         ;
  68.     }
  69.  
  70.     /**
  71.      * @param FormMapper $formMapper
  72.      */
  73.     protected function configureFormFields(FormMapper $formMapper)
  74.     {
  75.         $formMapper
  76.             ->add('id')
  77.             ->add('text')
  78.             ->add('leftKey')
  79.             ->add('rightKey')
  80.             ->add('level')
  81.             ->add('answerFor')
  82.             ->add('createdDt')
  83.             ->add('published')
  84.             ->add('deleted')
  85.             ->add('editDt')
  86.             ->add('editReason')
  87.             ->add('authorGuestName')
  88.             ->add('originalText')
  89.             ->add('objectType')
  90.             ->add('objectId')
  91.             ->add('branchEditDt')
  92.             ->add('rootId')
  93.             ->add('ip')
  94.         ;
  95.     }
  96.  
  97.     /**
  98.      * @param ShowMapper $showMapper
  99.      */
  100.     protected function configureShowFields(ShowMapper $showMapper)
  101.     {
  102.         $showMapper
  103.             ->add('id')
  104.             ->add('text')
  105.             ->add('leftKey')
  106.             ->add('rightKey')
  107.             ->add('level')
  108.             ->add('answerFor')
  109.             ->add('createdDt')
  110.             ->add('published')
  111.             ->add('deleted')
  112.             ->add('editDt')
  113.             ->add('editReason')
  114.             ->add('authorGuestName')
  115.             ->add('originalText')
  116.             ->add('objectType')
  117.             ->add('objectId')
  118.             ->add('branchEditDt')
  119.             ->add('rootId')
  120.             ->add('ip')
  121.         ;
  122.     }
  123. }
  124.  

Обратите внимание, на строки 47 и 50 (->add('commentAuthor')...->add('author')). Там уже мой костыль небольшой, не обращайте внимание. Так собственно в чем загвоздка, комменты на сайте могут поступать как от зареганых пользователей так и просто от тех кто ввел свое имя и капчу. В entity inСomments есть такие методы:
PHP:
скопировать код в буфер обмена
  1.  
  2. /**
  3.      * @var \VbUser
  4.      *
  5.      * @ORM\ManyToOne(targetEntity="***\UserBundle\Entity\User")
  6.      * @ORM\JoinColumns({
  7.      *   @ORM\JoinColumn(name="author_id", referencedColumnName="userid")
  8.      * })
  9.      */
  10.     private $author;
  11.  
  12. /**
  13.      * @var string
  14.      *
  15.      * @ORM\Column(name="author_guest_name", type="string", length=255, nullable=true)
  16.      */
  17.     private $authorGuestName;
  18.  
  19. //*****
  20.  
  21.        /**
  22.          *
  23.          * @return the VbUser
  24.          */
  25.         public function getAuthor() {
  26.                 return $this->author;
  27.         }
  28.         /**
  29.          *
  30.          * @return the string
  31.          */
  32.         public function getAuthorGuestName() {
  33.                 return $this->authorGuestName;
  34.         }


getAuthor() - возвращает объект VbUser, а getAuthorGuestName() - имя гостя. Задач состоит в том, что бы в списке комментов админки был один столбец Автор, а в него выводилось либо имя гостя либо getAuthor()->getUsername(); Причем username должен быть обернут в ссылку, которая ведет на страницу редактирования этого пользователя. Ссылку SonataAdminBundle делает как-то автоматически в поле ->add('author'). Автоматически делает имя пользователя ссылкой на страницу с редактированием этого пользователя, которая уже до этого давно была сделана. Т.е. в таком виде класса InCommentsAdmin в списке комментов у меня 2 столбца, один ->add('commentAuthor') - в котором просто стоит имя автора коммента, а в столбце ->add('author') стоят имена зареганных юзеров, только для тех комментов, которы оставлены от зареганых юзеров, в остальных случаях строка просто пустая.

Буду с нетерпение ждать вашего решение Радость
(Добавление)
Что бы было понятнее вот скрин, нужно объеденить 2 первых столбца в один.
(Добавление)
P.S.
Кстати говоря. Задачку уже решили, правда на её решение у моего более опытного и сообразительного начальника ушло 2 часа времени, не смотря на то, что он работает в этой симфони с июля месяца. На обычном php с обычной библиотекой db_simple я бы решил её за 20 мин.
nkl Отправлено: 25 Февраля, 2015 - 11:16:13 • Тема: Не могу понять как использовать фреймворки! • Форум: Объектно-ориентированное программирование

Ответов: 9
Просмотров: 2420
digi пишет:
nkl пишет:
Но вот что бы решить какую-то нестандартную задачу, которая не вписывается в рамки учебника.


Приведи пример такой задачи, может попробую посоветовать как её лучше вписать в архитектуру симфони.

Как только таковая попадется мне, обязательно вам отпишу. И тут дело не в том, что её невозможно решить, а в том, что в обычных условиях я бы решил её за 30 мин., а в Симфонии на это уходит в лучшем случае в 2 раза больше времени.
nkl Отправлено: 24 Февраля, 2015 - 12:44:55 • Тема: Не могу понять как использовать фреймворки! • Форум: Объектно-ориентированное программирование

Ответов: 9
Просмотров: 2420
Доброго времени суток господа. Это пост отчаяния и боли. Может я и не программист в общем? Короче тут такая фигня. Работали мы работали, пару лет работали, не мало сайтов сделали, все прекрасно работает, все очень быстро сопровождаем, допиливаем новый функционал по желанию и т.д. и т.п., все очень быстро и ничто никогда не вызывало у меня ступоров. Я просто брал задачу и решал её, просто открывал редактор и писал код в файл, который будет решать задачу. Возможно и скорее всего говно-код, в котором кроме меня вряд ли кто-то разберется, но он сука прекрасно работает и если меня просят что-то добавить, я очень быстро нахожу место где и что нужно подкрутить что бы это добавить. Но вот с июля месяца мой напарник стал перевозить наш самый крупный проект на SF2, тогда еще куча задач была и он как более опытный разработчик занялся пониманием Symfony, а я продолжал вариться в этой каше говнокда и допилить новый функционал. Так вот, проект тот успешно сейчас работает на SF2, куча нового в него добавляется, но все это делаю не я, а мой напарник. Он сейчас в этой Симфонии как рыба в воде, при чем, когда в виду моего отсутствия ему приходиться лезть в наш старый код, он часами разбирается что там к чему что бы какую-то мелочь запилить. А я же блять, настолько туп, что никак не могу вдуплить в эту Симфонию! Я не понимаю все этих сервисов, сущностей, репозиториев, конфигов в ямле, трейтов и прочего. Причем я прекрасно понимаю что такое autoloading-классов по PSR-стандарту, знаю что такое нэймспэйсы, знаю что такое наследование, инкапсуляция, полиморфизм и прочие приемы и концепции ООП, я их постоянно использую и применяю в конце-то концов! Я прошел несколько пошаговых вводных курсов по Симфонии на русском языке, читал документацию на английском офф. сайте. Но я блять все равно не понимаю! Не понимаю! Как её применять на практике для решения конкретных быстрых задач! По уроку все прекрасно, создаю бандл, ставлю Соната Админ, делаю БД при помощи доктрины, работаю с ней через ОРМ, очень быстро создаю CRUD для таблиц где они нужны без админки, создаю и отлажываю маршруты. Но вот что бы решить какую-то нестандартную задачу, которая не вписывается в рамки учебника. Я не могу! Почему? Что я делаю не так? Может посоветуете что прочитать, может я что-то упустил на раннем этапе становления своей личности как программиста? Может я просто говнокодер, которому не дано это писать на Симфонии? Помогите! Огорчение
nkl Отправлено: 30 Декабря, 2014 - 12:54:32 • Тема: Возможно ли ЧПУ • Форум: Вопросы новичков

Ответов: 2
Просмотров: 110
http://site[dot]ru/shop/search/pr1/pr2/etc
nkl Отправлено: 12 Декабря, 2014 - 08:33:18 • Тема: Помогите навести порядок в некотором агрегаторе... • Форум: Вопросы новичков

Ответов: 20
Просмотров: 859
Разобрался с непонятками в логах, теперь все выглядит более наглядно. Кроме того, добавил еще один скрипт в очередь (теперь их 3).
Цитата:
Register scripts: get_feeds, aggregate, make_ready_events

И выполнятся они должны в той последовательности, в которой они зареганы.
Цитата:
2014-12-12 9:14:27 - INFO --> The end work of script runner with script: get_feeds.
2014-12-12 9:15:01 - INFO --> Start runner.
2014-12-12 9:15:01 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:15:01 - INFO --> Last execution script: get_feeds
2014-12-12 9:15:01 - INFO --> Current execution script: aggregate
2014-12-12 9:15:01 - INFO --> No running scripts. Run aggregate...
2014-12-12 9:15:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-12 9:16:01 - INFO --> Start runner.
2014-12-12 9:16:01 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:16:01 - INFO --> Last execution script: get_feeds
2014-12-12 9:16:01 - INFO --> Current execution script: aggregate
2014-12-12 9:16:01 - WARN --> Script aggregate is alrady runnig. Die.
2014-12-12 9:16:01 - WARN --> The end work of script runner because aggregate is already running.
2014-12-12 9:17:00 - INFO --> The end work of script runner with script: aggregate.
2014-12-12 9:17:00 - INFO --> Start runner.
2014-12-12 9:17:00 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:17:00 - INFO --> Last execution script: aggregate
2014-12-12 9:17:00 - INFO --> Current execution script: make_ready_events
2014-12-12 9:17:00 - INFO --> No running scripts. Run make_ready_events...
2014-12-12 9:17:00 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/make_ready_events.php"
2014-12-12 9:17:04 - INFO --> The end work of script runner with script: make_ready_events.
2014-12-12 9:18:01 - INFO --> Start runner.
2014-12-12 9:18:01 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:18:01 - INFO --> Last execution script: make_ready_events
2014-12-12 9:18:01 - INFO --> Current execution script: get_feeds
2014-12-12 9:18:01 - INFO --> No running scripts. Run get_feeds...
2014-12-12 9:18:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/get_feeds.php"
2014-12-12 9:18:26 - INFO --> The end work of script runner with script: get_feeds.
2014-12-12 9:19:02 - INFO --> Start runner.
2014-12-12 9:19:02 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:19:02 - INFO --> Last execution script: get_feeds
2014-12-12 9:19:02 - INFO --> Current execution script: aggregate
2014-12-12 9:19:02 - INFO --> No running scripts. Run aggregate...
2014-12-12 9:19:02 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-12 9:20:02 - INFO --> Start runner.
2014-12-12 9:20:02 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:20:02 - INFO --> Last execution script: get_feeds
2014-12-12 9:20:02 - INFO --> Current execution script: aggregate
2014-12-12 9:20:02 - WARN --> Script aggregate is alrady runnig. Die.
2014-12-12 9:20:02 - WARN --> The end work of script runner because aggregate is already running.

Как видите, я по крону каждую минуту запускаю этот скрипт-ранер и он автоматом определяет, какой скрипт должен быть запущен, на основе того, какой скрипт запускался до этого, имя которого и пишется в файл. У меня не такая уж и большая последовательность (в ходе ведения этой темы я её слегка сократил с 5 до 3 скриптов), и потом, мне нужно знать только 1, какой скрипт был завершен последний раз, а на основании этого я уже знаю, какой скрипт необходимо запустить следующим.
Пока вроде все работает как надо. Если кому нужна новая версия этого скрипт-ранера, то вот исходник:
Спойлер (Отобразить)

Ксласс Klogger думаю сами найдете на просторах...
В общем: проблема решена, тему можно закрывать. Всем спасибо за участие! Улыбка
nkl Отправлено: 11 Декабря, 2014 - 19:40:20 • Тема: Помогите разобраться со скриптом • Форум: Напишите за меня, пожалуйста

Ответов: 11
Просмотров: 33
Мда, туго без английского в программировании... Там же черным по белому написано:
Цитата:
Before using these classes, you need to install the PEAR package on your server.

что примерно означает: "Перед использованием этой библиотеки, тебе необходимо установить PEAR пакет на свой сервер."
Но только я так и не нашел ссылки на скачивание его классов, а именно:
CODE (php):
скопировать код в буфер обмена
  1. include_once('Mail.php');
  2. include_once('Mail_Mime/mime.php');

В папке с примером их нет, странно, может в комментах что есть, поищи Ниндзя
Ну и если не найдешь, то придеться другой пример разбирать. А лучше самому разобраться как отправлять письма с вложениями на более простых примерах...
nkl Отправлено: 11 Декабря, 2014 - 17:07:31 • Тема: Помогите разобраться со скриптом • Форум: Напишите за меня, пожалуйста

Ответов: 11
Просмотров: 33
Ну тебе короче кроме примера еще и класс надо, а ты видимо забыл его скомуниздить, ищи, без него никак. А ты думал?
nkl Отправлено: 11 Декабря, 2014 - 16:25:20 • Тема: Помогите разобраться со скриптом • Форум: Напишите за меня, пожалуйста

Ответов: 11
Просмотров: 33
У тебя где-то в коде не хватает объявления экземпляра класса $message. Что это вообще за объект и какого он класса?
nkl Отправлено: 11 Декабря, 2014 - 16:10:11 • Тема: Помогите разобраться со скриптом • Форум: Напишите за меня, пожалуйста

Ответов: 11
Просмотров: 33
Мда, меня тоже честно говоря смущает строка 426, которая:
PHP:
скопировать код в буфер обмена
  1. $message->addAttachment($path_of_uploaded_file);
Однако
nkl Отправлено: 11 Декабря, 2014 - 13:39:44 • Тема: помогите с тестовым • Форум: Программирование на PHP

Ответов: 14
Просмотров: 843
Да ну! Все это полный бред! Конечно, все зависит от того, как звучало задание и сколько было выделено времени на его выполнение. В нашей конторе например, главное скорость, с которой выпускаются билды, а не их качество, иной раз даже БД проектируется исходя из времени. Т.е. например, дано тебе спроектировать какой-то функционал и хранение данных под него, за день. Ты там наворотишь конечно черт ногу сломит, другую вывернет, но самое главное, что бы операторы не просиживали и всегда были заняты работой. А потом уже спокойно думаешь над оптимизацией этой БД, добавлением новых возможностей по выборкам, атомарности данных, пишешь десятки скриптов, которые переведут уже забитые данные в новый формат и в итоге от первоначального варианта у тебя не остается ни одного столбца. А главное, потом ты никуда не торопишься, потому что этот первый костыль уже нагрузил работай людей, которым платят ежемесячный оклад и которые не должны просто так сидеть и вконтактике лазить, пока программисты для них БД готовят. Думаю что ни одна программа не пишется без ошибок и сразу все правильно работает. Бред полнейшей воды! И думаю те кто давал вам это задание, тоже делают кучу ошибок и допускают уязвимости, только исправляют их в ходе работы приложения и поступления жалоб от пользователей. И то, что вам тут наговорили, тоже полная херня, раньше я тоже так думал. Хм
nkl Отправлено: 11 Декабря, 2014 - 12:44:19 • Тема: Помогите навести порядок в некотором агрегаторе... • Форум: Вопросы новичков

Ответов: 20
Просмотров: 859
Что бы знать, какой должен быть запущен следующий скрипт. Мне нужно выполнять несколько скриптов в строгой последовательности, и только после того, как предыдущий был завершен, запускать следующий. И не в коем случае не параллельно. Именно поэтому мне сразу и не подошел сервер очередей, хотя esterio, как то сумел взять управление очередью в свои руки и то, только для того, что бы не ставить в очередь скрипт, который там уже стоит или выполняется. Но так и я смог, а вот именно с порядком выполнения так и не получилось совладать.

За join спасибо, век живи век учись Язычок
nkl Отправлено: 11 Декабря, 2014 - 09:41:25 • Тема: Помогите навести порядок в некотором агрегаторе... • Форум: Вопросы новичков

Ответов: 20
Просмотров: 859
Цитата:
Ну вот и все. Найден обход лимитов по памяти на хостинге ))

Это был сарказм? Не понял
Я же привел примеры того, как проверял это. Ну да, конечно у меня не хостинг, у меня VPS. Но все равно, честно говоря я не пойму как это работает, потому что register_shutdown_function() можно объявить где угодно, и скрипт может вылететь до этого объявления. Может интерпретатор проходит весь сценарий и выявляет все места где может регистрироваться функция завершения и перед выполнением всего сценария выделяет оперативку для этой функции?
В общем, я не знаю как это работает, но вроде оно работает. Погоняем, понаблюдаем, по-тестируем.. Хм
(Добавление)
Уф, вот собственно говоря что у меня таки получилось (script_runner.php):
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //Инициализация
  3. include(__DIR__ . '/_jobs_config.php');
  4. include(__DIR__ . '/../_lib/klogger.class.php');
  5. define('WORK_DIR', __DIR__);
  6. define('COMMAND', '/usr/bin/php ');
  7. define('EXT', 'php');
  8. define('LOG_PATH', '/var/log/feed');
  9.  
  10. $log = new KLogger(LOG_PATH . '/script_runner.log', KLogger::DEBUG);
  11. $log->LogInfo('Start runner.');
  12.  
  13. $scripts = array(// регистрируем список запускаемых скриптов при помощи этого файла
  14.         'get_feeds',
  15.         'aggregate',
  16.         //'make_ready_events'
  17. );
  18. $register_scripts = '';
  19. foreach($scripts as $script){
  20.         $register_scripts .= $script . ', ';
  21. }
  22.  
  23. $log->LogInfo('Register scripts: ' . $register_scripts);
  24.  
  25. $last_script = file_get_contents(WORK_DIR . '/last_script.queue');//получаем последний отработавший скрипт
  26.  
  27. $log->LogInfo('Last execution script: ' . $last_script);
  28.  
  29. switch($last_script){//устанавливаем срипт, который должен выполниться после последнего выполненого
  30.         case 'get_feeds':
  31.                 $current_script = $scripts[1];
  32.                 break;
  33.  
  34.         case 'aggregate':
  35.                 $current_script = $scripts[0];
  36.                 break;
  37.  
  38.         default:
  39.                 $current_script = $scripts[0];
  40.                 break;
  41. }
  42. $log->LogInfo('Current execution script: ' . $current_script);
  43.  
  44. foreach($scripts as $script){//проверяем, есть ли уже какой-то работаеющий скрипт
  45.        
  46.         $shell_command = 'ps ax | grep ' . $script . '.' . EXT;
  47.         $ps_out = `$shell_command`;
  48.         $needle = COMMAND . WORK_DIR . '/' . $script . '.' . EXT;
  49.         $pos = strripos($ps_out, $needle);
  50.        
  51.         if ($pos === false){
  52.                 //print "Script '" . $script . "' is not running. Continue.\n";
  53.         }else{//если какой либо из скриптов уже запещен, умираем...
  54.                 $log->LogError('Script '.$script.' is alrady runnig. Die.');
  55.                 register_shutdown_function('shutdown', $script);//пишем текущий работающий скрипт, как последний
  56.                 die("Script '" . $script . "' is alrady runnig. Die.\n");
  57.         }
  58. }
  59. //если дошло до сюда, то значит не один из скриптов не выполняется в данный момент, текущий установленный скрипт
  60. $log->LogInfo('No running scripts. Run ' . $current_script . '...');
  61.  
  62. //print "No running scripts.\nRun current script!\n";
  63.  
  64. register_shutdown_function('shutdown', $current_script);//регистрируем этот скрипт, как последний запускавшийся
  65.  
  66. $exec = COMMAND . WORK_DIR . '/' . $current_script . '.' . EXT;
  67. $log->LogInfo('Exec: "' . $exec . '"');
  68. exec($exec);
  69.  
  70. function shutdown($last_script){
  71.         global $log;
  72.         $log->LogInfo('The end work of script runner with script: ' . $last_script);
  73.         file_put_contents(WORK_DIR . '/last_script.queue', $last_script);
  74. }

(Добавление)
А а вот собственно говоря и лог работы этого ранера:
Цитата:
2014-12-11 11:52:22 - INFO --> The end work of script runner with script: get_feeds
2014-12-11 11:53:01 - INFO --> Start runner.
2014-12-11 11:53:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:53:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:53:01 - INFO --> Current execution script: aggregate
2014-12-11 11:53:01 - INFO --> No running scripts. Run aggregate...
2014-12-11 11:53:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-11 11:54:01 - INFO --> Start runner.
2014-12-11 11:54:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:54:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:54:01 - INFO --> Current execution script: aggregate
2014-12-11 11:54:01 - ERROR --> Script aggregate is alrady runnig. Die.
2014-12-11 11:54:01 - INFO --> The end work of script runner with script: aggregate
2014-12-11 11:54:40 - INFO --> The end work of script runner with script: aggregate
2014-12-11 11:55:01 - INFO --> Start runner.
2014-12-11 11:55:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:55:01 - INFO --> Last execution script: aggregate
2014-12-11 11:55:01 - INFO --> Current execution script: get_feeds
2014-12-11 11:55:01 - INFO --> No running scripts. Run get_feeds...
2014-12-11 11:55:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/get_feeds.php"
2014-12-11 11:55:25 - INFO --> The end work of script runner with script: get_feeds
2014-12-11 11:56:01 - INFO --> Start runner.
2014-12-11 11:56:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:56:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:56:01 - INFO --> Current execution script: aggregate
2014-12-11 11:56:01 - INFO --> No running scripts. Run aggregate...
2014-12-11 11:56:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-11 11:57:01 - INFO --> Start runner.
2014-12-11 11:57:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:57:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:57:01 - INFO --> Current execution script: aggregate
2014-12-11 11:57:01 - ERROR --> Script aggregate is alrady runnig. Die.
2014-12-11 11:57:01 - INFO --> The end work of script runner with script: aggregate

Как видите, скрипты запускаются в строгой последовательности и никогда не запускается 2 одинаковых скрипта или 2 скрипта одновременно.
(Добавление)
Конечно здесь есть непонятные мне моменты, но вроде как все работает правильно. Буду добавлять еще скрипты в управляющий раннер и смотреть что будет получаться.
nkl Отправлено: 11 Декабря, 2014 - 06:53:29 • Тема: Помогите навести порядок в некотором агрегаторе... • Форум: Вопросы новичков

Ответов: 20
Просмотров: 859
Господа это гениально! Вот 2 простых теста, которые доказывают, что register_shutdown_function(), выполняется даже если у вас Allowed memory size или Maximum execution time!
CODE (php):
скопировать код в буфер обмена
  1. <?php
  2.  
  3. ini_set('memory_limit', '1M');
  4. print "Start...\n";
  5. $arr = array();
  6. for($i = 0; $i < 1000000; $i++){
  7.         //$arr[$i] = rand(1000000, 9999999);
  8.         for($j = 0; $j < 1000; $j++){
  9.                 $sum = $i + $j;
  10.         }
  11.         print $sum."\n";
  12. }
  13.  
  14. //var_dump($arr);
  15.  
  16. function shutdownd(){
  17.         print ("The end of script!\n");
  18. }

Вывод:
Цитата:
...
42765
42766
42767
42768
42769
42770
42771
PHP Fatal error: Maximum execution time of 2 seconds exceeded in /home/user/scripts/test_shutdown .php on line 11
The end of script!

И еще один:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. ini_set('memory_limit', '1M');
  4.  
  5. print "Start...\n";
  6. $arr = array();
  7. for($i = 0; $i < 1000000; $i++){
  8.         $arr[$i] = $rand(1000000, 9999999);
  9. }
  10.  
  11. var_dump($arr);
  12.  
  13. function shutdownd(){
  14.         print ("The end of script!\n");
  15. }

Вывод:
Цитата:
Start...
PHP Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 32 bytes) in /home/user/scripts/test_shutdown .php on line 10
The end of script!

А с другой стороны, ведь так и должно быть! Ну не может же пых быть настолько убогим, что бы не обрабатывать такие исключительные ситуации. Хотя может и механизм исключений позволяет такие ошибки отлавливать, честно говоря не знаю, но register_shutdown_function() точно позволяет это сделать! Рот до ушей

esterio, у меня машина вчера сломалась, так что и вчера вечером и сегодня утром до работы пехом пёр. И вы знаете, такие гениальные мысли в голову приходят во время обычной ходьбы, не то что при езде за рулем, так что в скором времени (думаю к концу сегодняшнего дня) приведу пример своего решения моей задачи!
nkl Отправлено: 10 Декабря, 2014 - 11:19:47 • Тема: Помогите навести порядок в некотором агрегаторе... • Форум: Вопросы новичков

Ответов: 20
Просмотров: 859
Цитата:
значит файл надо лочить, и опять двадцать пять.

Во-во и я тоже сразу не вкурил в чем умность по пиду определять процесс, он ведь уникальный, а с пидом как раз и возникали проблемы о которых я писал в СП.

Таким образом (грепать пээс) можно проверять не один процесс. Например, у меня их 5 штук и какие-то зависят от работы сразу нескольких, например, если выполняется процесс get_feeds.php, то ни в коем случае нельзя запускать агрегацию, потому что get_feeds.php делает TRUNCATE таблицы и если в этот момент запустить aggregate.php, то для него не будет рабочих данных.

В общем, щас юзаю Ваш метод, DeepVarvar. Посмотрим что из этого получиться. Но все равно спасибо за грамотные наводки! Курю

Страниц (21): « 1 [2] 3 4 5 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB