Ответы пользователя по тегу PHP
  • По какому принципу работает autoload в composer?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    .ну в пыхе есть событие которое стреляет если ты пытаешься получить класс который еще не подгружен в память. Чтобы добавить на него действия, есть функция spl autoload register

    Внутри композера отталкиваются от соглашения, что неймспейс должен быть равен пути к папке с файлом. Для частных случаев есть возможность указать неймспейс такойто в папке такойто, а дальше отрежет и будет искать относительно и по соглашению.

    Для ускорения работы есть команда dump autoload, которая по вышеуказанным правилам пробежится по папкам и сделает ассоциативный массив, где ключ это класс, значение = путь к файлу. При запросе нового класса тогда уже не будет поиска и обращения к жесткому диску, а будет только isset
    Ответ написан
    Комментировать
  • Как подключить phpunit 8+ без автозагрузчика composer?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Да он хороший, не отказывайся. Загрузчик то только классы ищет по файлам и все. Нету в загрузчике придется require class.php... но яйца в профиль те же получатся

    Там под капотом spl autoload register и полный список всех файлов ы закешированном виде, а так никакой магии
    Ответ написан
    2 комментария
  • Когда стоит писать модули а когда контроллеры?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Контроллер в переводе на человеческий равен частному случаю. А модуль = в данном разговоре это повторяющийся кусок. Вот так рассуждай. Проверка входных данных это обычно частный случай. А вот сам проверяльщик это модуль.

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

    Кстати выглядеть будет топорно но иначе никак. Булет чтото вроде new CategoriesCreateRequest() хотя казалось бы у нас и так есть CategoriesController createAction. Просто у нас будет несколько контроллеров категорий под разные страницы сайта
    Ответ написан
    Комментировать
  • Как подключить сервер на push-уведомления пользователя?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Разобрался, через mpg25 апишку можно проставить сначала following, затем favorite, и когда есть фаворит - можно через тот же код поднять сервер, который от имени юзера подключиться на Пуш-канал. Пуш-канал работает строго для favorited.

    Нужно поднять скрипт while (true) и вызвать метод c ловлей пуш-уведомлений.
    Но думаю, Инста быстро прикроет тему если их будут тысячи. Поэтому надо писать систему куда можно быстро добавить еще пару логинов, в каждый из которых фаворитить свои аккаунты, за которыми следить

    Не простая система, но в целом реализуемая
    Ответ написан
    Комментировать
  • Как сделать многоязычное отображение служебных сообщений на PHP?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    А еще есть такой стандарт любопытный - .po/.mo файлы, и их редактор - Poedit. С ними очень здорово танцевать, когда языков больше 4, а файлов больше 100.
    Ответ написан
    3 комментария
  • Как связать Vue.js с php?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Пользуют вот такой вариант:
    из php
    echo sprintf("<script>var json_data = '%s';</script>", json_encode($arr));

    иногда можно всунуть в виде тега в html какой-нибудь base64, чтобы потом из яваскрипта распознать. ну разные способы есть.
    Ответ написан
    2 комментария
  • Можно ли запустить php скрипт используя тег img или адресную строку, если он передаётся с header-ом "Content-Disposition: attachment"?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Можно мне еще раз другими словами объяснить, что именно ты хочешь сделать?
    Сервер всегда вешает заголовок attachment?
    И ты можешь закачивать?
    Закачай новый htaccess где будет прибит новый заголовок
    Или в самом скрипте укажи заголовок
    Скрипт это лишь способ выполнить команду серверу
    Если он вешает заголовок, то это значит где-то есть команда привесить заголовок.
    Давай поточнее
    Ответ написан
  • Как отобразится 1 материал с максимальным id, а за ним 5 материалов с меньшими id в категории?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    id это не для тебя - это номер записи в системе.
    он используется для связи между двумя базами, обеспечивая уникальность записей.

    для вывода используй другие способы сортировки
    от сортировки по каким-то полям по очереди, до составления строки из чисел для сортировки по этой строке
    Ответ написан
    Комментировать
  • Авто сокращение ссылок?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Тут я бы начал с того, что разделил сущность опубликованных ссылок и страниц. Потому что если короткая ссылка будет указывать на короткую - ты прилетел (ситуация когда 1 короткая указывает на 2 короткую, а 2 короткая - назад на первую).

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

    В сущности же наиболее на мой взгляд умное решение для людей - это иметь кнопку "копировать ссылку" и рядом с ней "копировать короткую ссылку" ведь именно это цель - позволить пользователям обмениватся инфой на устройствах, где пока еще не очень удобно вводить текст.
    Ответ написан
    Комментировать
  • Как сделать сохранение значений веб-формы в EXCEL-фаил и отправить как вложение из веб-формы (Веб-формы 1С-Битрикс)?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    К Кодерисимо добавлю что файл отправить "как будто через форму" можно используя multipart/form-data, если нужно к емейлу прикрепить все совсем просто - fopen, fwrite, fclose, mail($headers = ....file);

    Если идет отправка на другой скрипт - используйте multipart/form-data или curl. У всех свои косяки - curl имеет свойство повисать, поитогу время от времени второй запрос не доходит, потому что первый все еще висит, поэтому нужно делать несколько запросов через while пока не исчерпается лимит или пока не будет получен ответ.

    multipart в свою очередь сложнее в написании - нужно определить разделитель, а потом тупо отправлять контент как строку, разделяя каждый файл разделителем, переносом строки, потом контент, потом 2 переноса, а строку - закодированную любым способом - у принимающего скрипта появится массив $_FILES.

    Стоит отметить, что действительно, как мне и пояснили на тостере - отправка данных через multipart/form-data не сделает отправку гарантированной в 100% случаев - это всего лишь позволит в случае успешного запроса автоматически закинуть файл во временную папку, так что ничто не мешает отправить данные в виде json - если это текстовый файл, а не уже закодированный бинарник.

    Другой вопрос если задачей является сохранить инфу из формы в эксель, в этом случае вам не нужно отправлять файл, вам нужно отправить данные скрипту, который из данных сделает файл.

    Но можете поизвращаться с отправкой сразу файла, еслли хочется помучаться.
    Ответ написан
    Комментировать
  • Как вынести расчёт из JavaScript?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Да, у тебя расчет выполняет модель в PHP, а из яваскрипта ты делаешь запрос к этому расчету аяксом.

    Главное чтобы твой аякс не вызывал загрузку всего сайта, а просто делал расчет, тогда все будет ну оччень быстро. Как можно это понять - сделай запрос на несуществующий URL - если сайт не подрубается - ты получишь ответ "сервер не отвечает" или стандартный .htaccess-ный Forbidden, а если подрубается - то это будет генерация страницы типа "такой страницы нету".

    К примеру сравнить и рассчитать 2000 товаров, запросив сохранив результаты в гугл докс по ходу, и получив справочники из того же гугл докс, и все это выдав в виде json массива, сохранив кеши - занимает чуть больше 10 сек, и это без использования быстрых функций - просто чем было написано.

    Если не подгружать весь фреймворк, чтобы вызвать действие "рассчитать", а работать с существующей базой из кеша товаров по ценам - расчет будет мгновенно делаться и не будет так набившего оскомину "лоадера" на 10 секунд расчета трех товаров из корзины. Впрочем точный запрос по id товаров в базу отработает так же быстро, если его написать с нужными join-ами, а не "запрос-запрос-запрос-объединить на PHP-рассчитать-объединить-запрос-проверить".

    Впрочем, можно и действительно на ноде какой-нибудь. Главное помнить, что когда расчет делает сервер - он в работе, то есть нагрузка, когда расчет делает клиент - он может прислать тебе хрень разную (хакеры, да да), которую ты никак не проверишь, не произведя расчет на сервере.
    Ответ написан
    Комментировать
  • Как в opencart вывести статью на главную страницу?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ну смотри, в OC - "модель" это файл с командами запросов и обработкой результата.
    Ты его "подключаешь"...
    $this->load->model('catalog/information');
    ...а потом вызываешь метод оттуда, передавая параметр в функцию
    $information_id = 4;
    $information_info = $this->model_catalog_information->getInformation($information_id);


    Теперь у тебя в $information_info лежат данные в каком-то виде (об этом в самом файле модели - там обработка и запросы).

    Эти данные тебе нужно вывести в некоем "шаблоне" - так случилось что в OC шаблоны называются так же, как и файлы действий - "контроллеры". Главную обрабатывает /controllers/common/home.php

    В этом файле в самом низу есть вызов шаблона, в который передается переменная $data. В эту $data тебе надо твои данные сохранить, и они будут доступны в файле шаблона, который там вызывается.

    В шаблоне уже выводи, хочешь циклом, хочешь другими шаблонами, способов масса.
    Ответ написан
    1 комментарий
  • Какая CMS оптимальнее всех подходит для интернет-магазинов?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Нужно понимать что CMS "не подходит" для интернет-магазина, она "подходит заказчику" за счет своей удобности.
    Тебе как программисту подойдет связка navicat+sublime с крышей лет на 10.

    А вот им нужна красота и иллюзия простоты, хотя нет ничего проще экселя для управления торговлей, если понимать - какие бывают данные и как надо за ними следить. CMS - средство слежения за данными, не более того.

    Из дизайна - подходит Битрикс. Он очень красивый внутри и авторитетный. За счет внутренней сложности (он безумно сложный на первых порах и жутко тупой) - цены на работы в битриксе достаточно высокие, но разве это не плюс? Дак более того - за это чудо еще и платить надо, и за счет своего авторитета CMS сама доказывает "очень умному" бизнес-гуру, что "это г...." крутое. Ну то есть с позиции денег, дизайна и понтов - это просто идеальное решение.

    Если тебе надо ДЛЯ СЕБЯ cms - то лучше не используй cms. Для себя - это фремворки и понимание взаимодействия клиент-сервер. Терминал линукс твой лучший друг, SQL язык - твой брат, а REST API - твои столовые приборы. (если интересно что это - напиши, я поясню)

    Если для заказчика но дешево - можешь взять opencart/ecshop/woocommerce - но все имеют свои недостатки и сьедят твой мозг при изучении. Ты по сути берешь на себя его головняк, глупо, но как хочешь. Современный бизнес делает очень круто - сначала заказывается дешевый кодер, который говнокодом пишет сайт, потом нанимается ДОРОГОЙ кодер почти-бесплатно (потому что без работы сидит) - который все чинит на энтузиазме и доброте, а не за деньги. Их такой расклад устраивает. Попытка обьяснить что сайт = говнокод - это некомпетентность. Ну то есть таким образом чем больше мозгов, тем сложнее заработать, т.к. сначала нанимается дешевый кодер, а потом дорогой, но тоже дешево. Как долго мы будем идиотами? Не знаю, для этого мужество надо, чтобы отказывать ВСЕМ бизнесменам из принципа.

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

    ecshop вообще написана на функциональном подходе. во многих местах это упрощает работу, в других - усложняет ее за счет необходимости копирования и повторных изменений.

    woocommerce требует знаний вордпресса и использует такие говно-вещи как jquery.blockui, который на время аякс запроса не просто блокирует интерфейс, а еще и не дает вешать события, в итоге стоит тебе подумать об асинхронности - съешь себе мозг.

    наиболее близкой к пониманию "данных как проще" лежит ModX, но вот магазинные навороты не помню какие там - для меня всегда коллекции товаров были просто массивами (в голове), и мне "плагин по установлению акции на товар" был изначально не нужен. Но некоторые любят цмс за возможность "установить из плеймаркета" а потом вдоволь всей конторой полгода потрахаться, пытаясь понимать, почему два "готовых решения" не могут работать вместе. Как всегда - начальник главнее, поэтому причину ищем в следствии, а не наоборот, ну у них там.
    Ответ написан
    7 комментариев
  • Как передавать пароль от браузера серверу, как его хранить на сервере и проверять корректность?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    В зависимости от степени безопасности.

    Если разбить все это на "по-проще", общий принцип такой:

    Клиент:
    - в первый раз ввести строку текста
    - нажать отправить
    - больше не вводить, ибо лентяй, а мы ж ему продавать собрались, не дай бог он сука дискомфорт почувствует

    Сервер:
    - получить строку текста
    - сделать хеш
    - проверить - чей это хеш (не угнали ли его по дороге)
    - в ответ отправить токен, который будет работать ограниченное время только для этого компьютера
    - токен сохранить на компе пользователя, и следующий раз отправлять автоматически для каждого действия без ведома юзера
    - при каждом действии обновлять время хранения токена (некоторые особо шизанутые делают новый токен каждое действие)
    - при малейшем подозрении на несоответствие токена - предложение вежливо пройти через авторизацию еще раз, но поскольку человек существо забавное - если ему скажут опять пароль вводить - он сука обидится, и потому придумана "двухэтапная" - через телефон или там отпечаток пальца или что угодно еще, да и полезно это - если пароль действительно угнали - отрезать палец и вырвать глаз - это еще можно вместе сделать, а вот замочив человека - попросить его маму ввести пришедший из СМС-код - это уже придется шантажом заниматься.

    Локальных хранилищ тоже бывает куча целая:
    - кукисы (хранится прямо в браузере указанное время)
    - сессии (хранится на сервере, но в кукисах есть ключ к ячейке в "банке", который опять же могут угнать)
    - ... еще десятки способов, о которых знают только крутые кодеры, которые считают себя крутыми просто потому, что их знают, на деле с точки зрения создания ценности людям - бесполезные знания

    Как ты понимаешь, это иллюзия безопасности, а не гарантия.

    Угонят токен - и все, сервак можно обмануть. Поэтому на серваке делаются всякие проверки типа зашить в токен - ип-адрес, размеры экрана юзера, его отпечаток пальца, сетчатку глаза, юзер-агент, устройство - и где-то даже какой-то умник целую либу писал, который умудрлися в этот хеш почти тыщу разных параметров засунуть.

    Вот еще тема, которую василий сказал - шифровать пароль уже на стороне клиента в момент отправки формы яваскриптом. Представьте себя хакером. Вы получили пакеты какого-то чувака, поставили компьютер на расшифровку, подключив десяток видеокарт, расшифровываете пароль, а вместо него видите 64 символьный хеш, ну то есть он прямо от клиента таким вышел. После этого будут маты от того, что теперь массив видюх нужно заставить еще и ключевую фразу из хеша выдрать. Ну то есть еще время декодирования увеличивается. Если загнаться то хеш может быть не просто хешем md5() а например md5 от md5 от развернутой строки прибавленной к md5() прямой строки, прокинутой через побитовый сдвиг на один разряд - ну то есть даже в этом закодировать последовательность действий. При отсутствии https - наиболее надежный способ.

    И потом - программисты Yii не рекомендуют использовать фунцию md5(). Почему? Потому что она быстрая очень. И при переборе пароля массивом видеокарт перебирается он шибко быстро. Поэтому рекомендуют использовать hash функцию, которая для создания хеша использует побольше времени, несколько секунд скажем. При написании синхронной программы (сайта на php, например) - это заставит юзера подождать после регистрации секунды 3-4 лишних, но если загнаться то процесс генерации пароля можно запихнуть в асинхронщину, а пользователю сразу токен выдать, то есть пароль ему сгенерируется чуть позже. Таким образом - за счет более длинной хеш-функции по времени хакеру потребуется куда больше времени - то есть юзеру на прямое создание пароля 5 секунд, а хакеру на перебор нескольких миллионов паролей понадобится несколько лет. Никто ему не заплатит 10 косарей баксов, чтобы сломать ваш долбанный пароль ВКонтакте. Если банковская сфера - опять же как писал выше - хеш от хеша, да развернуть пару раз, да трижды порубить, потом постучать в бубен и все это в хеш еще раз и вуаля - декодирование пароля займет 100 лет.

    Еще значит, При малейшем намеки на несоответствие токена или внезапное изменение - сервак говорит "тю, дядя, давайка пройди второй этап авторизации, а то я не верю, что это реально ты" и просит приложить палец. Или ввести номер, получив СМС. Или вставить ключ-карту синюю (duke nukem hello). Но и тут есть взлом - ключ карту украсть, смс-ку - попросить телефон, приложить палец = отрубить руку, вырвать глаз и тд

    Тут к тебе на помощь приходит https. Https это такая штука, которая в двух словах может быть названа игрой в партизан. На войне играли так - когда радиопереговоры прослушивались, а шифраторов не было - единственным средством защиты - было использовать ошибки в тексте и матерные слова.

    Так и тут - данные отправляемые в виде нулей и единиц. Компьютеры их так же легко перекодируют в пароль, как и закодировали. Чтобы этого не было, придумали ШИФРОВАТЬ строку в одну сторону. У сервака есть трафарет, у пользователя другой трафарет. Сервак шифрует своим, но назад можно расшифровать только пользовательским. Вернее можно и сторонним конечно, но современные компьютеры сделают это за много лет, и потому никто не заморачивается особо, производительность не та.

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

    Так что авторизация - она простая. Вся надежда на шифрование. А сертификат, на котором пол-мира делает бабло - это средство подтверждения того, что компьютер умеет шифровать. Интересно, что он кончается каждый год, как будто в прошлом году компьютер умел шифровать, а в этом вдруг разучился. На деле конечно - просто гоните бабло, иначе покажем красный крестик вместо зеленого замочка, и в гугле понизим, так что гоните бабки. Вот.
    Ответ написан
    1 комментарий
  • Хранить ли фотки в базе данных?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Мое мнение - что от этого нужно избавляться.
    Если у тебя в фирме 1000 менеджерят, которые ничего не делают, а работать умеют только через CMS, вернее через нее тоже не умеют, но говорят что им надо - то это имеет смысл.

    Уже давно картинки у нас лежат просто по внешнему коду товара (будь то код 1С или поставщика или присвоенный скриптом) - и лежат просто в одной папке. Когда находим товар без картинки - переименовываем и закидываем. А дальше твой сайт делает ресайз картинок, и по названию исходной фотки он всегда может проверить - есть ли кешированный мелкий размер и выводит его.

    Для менеджерят пишется инструкция, что дескать переименовывать и вот форма - выделил из моего компьютера, перетянул. Скрипт после закачки записывает кто и когда.

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

    Нафига, если даже в легендарном c++ в структурах хеш-таблица (ограниченный массив со списком (неограниченным массивом) ключей) является нереальной экономией использование хеш функции вместо простого обращения к ячейке списка (безграничных массивов).

    Ну то есть хранить список путей едва-ли более затратная или менее затратная операция чем каждый раз из пути картинки получать ее имя и проверять наличие файла. Один черт ты проверишь его наличие, даже если у тебя будет список путей.
    Ответ написан
    Комментировать
  • Есть сайт, который берет данные из БД, как добавить вторую БД?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Константин, тебе нужно немного по-другому воспринимать проекты.
    Сейчас у тебя есть готовое решение в виде CMS, которое дает возможность подключить одну базу и с ней работает по заданным инструкциям.

    Но сайт это немного проще, чем cms. Это компьютер имеет инструкцию - спросить у такого-то источника, преобразовать, и показать в том виде что вам нужно.

    Чтобы подключить вторую БД одновременно с первой может случиться так, что ваша CMS не умеет этого делать. И вам придется писать систему скриптов, чтобы делать запрос к другой БД (у вас появляется второй "сайт") и считывать его первым.

    Наиболее простой способ для этого - тот самый аякс запрос, о котором вы говорите.
    Вы пишете скрипт, в котором написано примерно такое: "запросить то-то и то-то с такими-то условиями и вывести это в виде json". Со своего сайта делаете команду file_get_contents() этого файла и получаете все, что он вам выдаст.

    Аналогом file_get_contents для jquery будет $.ajax(). Они выполняют примерно то же самое (на низком уровне конечно нет) - но суть - вы отправили запрос, вы получили ответ. Дальше его нужно считать и либо сохранить в вашу базу, либо вывести как вам нужно и где нужно.

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

    Все как в жизни - у вас есть пульт для управления (клавиша вызовет действие), у вас есть среда - которая что-то сделает (компьютер, телефон или кусок железа с конденсаторами), и у вас есть место, куда он должен запомнить то, что вы скажете.

    Вы просто запросили и просто сохранили. Откуда и куда - не важно. Мы много лет назад пытались переубедить руководителей в том, что CMS это путь вникуда. Сегодня вы нашли эти грабли. CMS - закрытая система работающая с одним источником данных. Хотите другой - либо пишете другую систему, которая по команде в браузере выдаст данные, либо делаете прямой запрос из скрипта на другой сервер, но этим вы засираете код, и, напоминаю, вы были предупреждены, что есть понятие "плохо" которое в данном случае синоним "неудобно Вам будет".
    Ответ написан
    Комментировать
  • Cron, wget и отгрызание части файла - почему опять стэк может не работать?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Вероятный ответ напишу, пока не отмечаю:
    1. В коде имелась функция register_shutdown_function() которая писала логи при завершении программы
    2. После редиректа происходил вызов статического метода Import::end() который добавлял в лог "Спасибо, скрипт все" и вызывал exit();
    3. Несмотря на это пришлось разобраться в консоли дебиана и поиграть с командами top/free, поизучать логи, посмотреть, что все вроде бы работает...
    4. На мысли наводила только надоедающая "Mysql server is gone away", но казалось бы - почему?

    С одной стороны я на Битриксе такую ошибку часто ловлю - код у них паршивый, раз требуется в 10 раз более мощный сервак, чем для любого интернет-приложения.

    С другой стороны сам скрипт работает с Редиректом, и несмотря на то, что транзакция закрывается и от сервера отключаемся - что-то шло не так.

    Когда я вывел процессы через top, и посмотрел оперативку через free - оказалось оперативки нет, более того - после отключения сервера mysql - он даже не захотел включаться, недостаточно памяти.

    Память увеличил на виртуалке, и все пошло правильно работать. Тут то и пришла идея - а что если. Вывел top и увидел ужас- на меня одного запущено 32 апача, как будто он вообще не завершал процессы.

    А ведь функция exit() все таки есть. Видимо где-то происходит косяк.

    Я сделаю пару тестов без основного кода загрузчика, попытавшись поймать жука, но на кроне, чтобы убедится, что в этом все дело. Если да - отмечу решением.
    Ответ написан
    Комментировать
  • Что удобнее, тем, кто уже пробовал - Передавать ошибку return или сразу бросать Exception прямо из функции/foreach?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    На текущий момент мой ответ изменился, когда я закончил работу с пачкой поставщиков и постоянно меняющимися условиями - сегодня по цене, потом по сортировки, завтра еще по чем...
    1. Не использовать for {}, если есть map()
    2. В map возвращать array(1,msg,data)
    3. Если map вложенный или родительский - в ответ отправляется data, а ошибки собираются в err[]

    Таким образом где-то так:
    function mapfunc($item) {
      return array(null, null, array(
        "stdout" => $item,
        "stderr" => $foobar,
        )
      );
    }


    Это в соответствии с договоренностью о возврате массива array(errcode, msg, data).
    По итогу после map() для какой-то коллекции на выходе получим коллекцию из отчетов.

    Если с элементами после отчета нужно что-то делать - собираем их из отчетов, сами отчеты сохраняем для будущего вывода. С элементами повторяем процедуру.

    Если у нас (редко бывает но все же) коллекция из коллекций, и нужен рекурсивный обход - тот же алгоритм - прошлись, собрали отчеты, из отчетов получили данные, с данными дальше работаем.

    Главное не забывать, что данные могут быть вручную добавлены из функции map() и потому лучше те данные что были совать отдельным ключом, а те что по ходу подсовываются для информации об ошибке - отдельным.

    Это примерно как концепция отдельного процесса, когда у него есть поток вывода сервисный, для ошибок, а есть поток вывода пользовательский - для результата.

    Такой подход будет универсальным и для работы с ajax запросами, и для работы с коллекциями, и при загрузке в базу данных поочередно, и для очередей запросов - очень удобно, если освоить функцию типа _pluck, чтобы быстро отделять данные от отчетов.

    Но особо упертые могут делать два разных map() - один для отчетов по ошибкам, другой - с заглушенными ошибками и просто для данных - на выходе получится массив из null и корректных данных.

    Отдельная реализация может быть даже такая:
    $rep = array();
    $data = array_map(function ($row) use (&$rep) {
      $bad = false;
      if ($bad):
        $rep["bad"] = array(1, "msg", array("foo" => $foo, "bar" => $bar));
        return null;
      else:
        $rep["good"] = array(null, "OK", array("foo" => $foo, "bar" => $bar));
        return $row;
      endif;
    });


    Это все к тому, что ХОРОШЕЕ приложение - НЕ ИМЕЕТ ошибок. А с точки зрения логики приложение НЕ МОЖЕТ не иметь ошибок, поскольку нельзя гарантировать идеально правильного человека. Смысл ошибки сводится в конечном итоге к вине пользователя. Если пользователь сотворил беду и сам хочет ошибку - он должен ее получить, а если он ничего не делал толком, а ошибка произошла - то ее не должно было произойти.

    Но показывать то их нельзя, поэтому для главного модуля это warning, а для конечного этапа это exception. А ошибка одна и та же.
    Ответ написан
    Комментировать
  • Какой "индусский код" преобразует массив в реляционную структуру массивов?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Пока актуальный вариант - ни о какой универсальности еще нет речи, используйте на свой страх и риск
    Скачать исходник: --временно_недоступно--

    Код получился жирноватый, так что готовьте сигары и попкорн
    Картинка с результатами: https://www.screencast.com/t/nF8qygECj
    Ответ написан
  • Что быстрее 10 запросов к файлам или 10 к базе?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Вчера мне подсказал один господин очень интересное решение для этого непростого выбора

    Почти наверняка вы выбираете - где лучше хранить данные и чтобы получить удобное обслуживание системы (без длинных SQL) и быстрый поиск результатов (который как раз лучше в SQL, ведь в случае с файлом придется всю "базу" в оперативку лить, а значит постоянно докупать планочки и пинать админов - дескать поставьте побольше, а то чето тормозит), второе опять же - массивы длинной в пару километров долго читаются и парсятся редактором, то есть что-то изменить "открыв файл" - будет трудно - придется это делать через API, а значит проблемы или гениальное АПИ.

    Я пока остаюсь на реляционке, хотя гении типа Яндекса и Гугла давно делают все в файлах/nosql и наверняка есть ответ почему вида "если у тебя миллиард записей, сервак может тупо лечь".

    Есть такие штуки как поисковые движки. Ты в них данные закидываешь в виде массивов своих, а они дальше сами распределяют их в своей базе. Ты пишешь запрос и они под запрос сами выстраивают и кешируют ответы.

    Таким образом ты работаешь с массивами и сохраняешь в файлы, а движок сам строит структуры данных и выдает тебе кешируемые результаты где это возможно. Быстрое обслуживание, быстрый поиск и жизнь в шоколаде.

    В ближайшее время попробую такую комбинацию
    Ответ написан
    3 комментария