• Как и для чего используется php://input?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    2 комментария
  • Как и для чего используется php://input?

    @granty
    Данные и так передаются по POST (или GET), но есть нюансы их обработки на стороне сервера.

    1. POST и GET данные в виде parameter=value&param2=val2 автоматически обрабатываются сервером и заполняются глобальные массивы $_POST/$_GET/$_REQUEST:
    $_POST['parameter'] = value;
    $_POST['param2'] = val2;

    GET-параметры при этом ещё и автоматически декодируются по urldecode().
    Через php://input можно получить "сырые" необработанные данные.

    2. Методом POST можно прислать, например, объект JSON, указав 'Content-type: application/json; charset=utf-8'. При этом массив-обёртка $_POST будет пуста, тк не присылается Имя_Параметра, а присылается только Значение_Параметра, и сервер не обрабатывает такие данные автоматически.
    Получить такие данные можно только через php://input, так как глобальные массивы $_POST/$_GET будут пустыми.
    Ответ написан
    Комментировать
  • Какие есть преимущества Gearman перед RabbitMQ?

    @tarasbogach

    Плохо знаю Gearman, хорошо RabbitMQ. Основное отличие в том, что в Gearman у вас есть возможность получить статус конкретного задания в любой момент. В RabbitMQ, если вы хотите использовать его как таск-сервер, такую информацию придётся хранить отдельно (например, я храню прогресс выполнения задания в Radis). Кроме того придётся прибегать к "военным хитростям" если нужно отсрочить обработку задания. В остальном RabbitMQ в десятки раз быстрее, чем Gearman и отлично масштабируется.

    Ответ написан
    Комментировать
  • Как вывести список модулей nginx списком?

    BuriK666
    @BuriK666 Куратор тега Nginx
    Компьютерный псих
    nginx -V 2>&1|xargs -n1|grep module
    Ответ написан
    Комментировать
  • Где лучше учиться на программиста, если тебе за 35?

    xez
    @xez
    TL Junior Roo
    Шансы от этого не зависят.
    Учиться в любом случае придётся самостоятельно.
    Ответ написан
    Комментировать
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    sainnr
    @sainnr
    Как пишут умные люди (Шилдт, Троелсен) в своих умных книжках, интерфейс определяет функциональные возможности, поведение — «что именно следует делать, но не как это делать» (Г.Шилдт, Полное руководство C#). В абстрактном классе «определяется лишь самая общая форма для всех его производных классов, а наполнение ее деталями предоставляется каждому из этих классов» (там же).

    Простой пример, в контексте графического редактора можно определить:
    Абстрактный класс — Figure (геометрическая фигура), от него могут быть образованы классы конкретных фигур — например, Rectangle, Circle и т.д.
    Интерфейс — Drawable (то, что можно нарисовать). Он может быть реализован как во всех классах конкретных фигур (Circle, Rectangle), так и в других классах, не образованных от абстрактного Figure.
    Ответ написан
    Комментировать
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    miraage
    @miraage
    Старый прогер
    К примеру, нужно написать класс для работы с кэшем.

    У нас есть класс Cache, который будет делать всю грязную работу. Он в свою очередь будет использовать библиотеку под определенный тип кэша (memcached, eaccelerator, ...). Для согласованности, библиотека должна реализовать интерфейс cacheInterface, чтобы класс Cache мог нормально работать. Вот небольшой пример.

    Интерфейс для библиотеки:
    Ответ написан
    3 комментария
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    @resurection
    Я бы сказал так:
    Интерфейс — это возможность задать жёсткую семантику.
    Абстрактный класс — это возможность вынести дублирующийся код и явно это отметить в иерархии.
    Ответ написан
    Комментировать
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    try4tune
    @try4tune
    С точки зрения архитектуры:

    Интерфейс описывает свойства. Обратите внимание на классические названия интерфейсов: Throwable, Countable, Comparable, Iterable и т.д. Возьмем, к примеру, интерфейс Rollable (катящийся), и Foldable (складывающийся).

    Абстрактный класс же описывает сущность. Например, стол: Table_Abstract. Стол может быть деревянным, тогда будет Table_Wood extends Table_Abstract. Также стол может быть хирургическим: Table_Surgical extends Table_Abstract. В таком случае Table_Abstract объединяет общий свойства всех столов (скажем, площадь поверхности, наличие ножек и т.п.). А конкретный класс описывает сущность определенного типа столов.

    Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.
    Ответ написан
    5 комментариев
  • Для чего существует $_REQUEST?

    Stalker_RED
    @Stalker_RED
    Для начала, для чего существует POST.
    Представим, что у вас есть сайт example.com и на нем форма с кнопкой, удаляющаяя статью.
    На сервере вы, естественно, проверяете авторизован ли пользователь и есть ли у него права на удаление.

    При нажатии на кнопку через post передаются такие параметры
    article_id: 123
    action: delete

    Если на сервере вы будете получать эти данные при помощи $_REQUEST, то возможна ситуация, когда злоумышленник делает так:
    <img src="http://example.com?action=delete&article_id=1">
    <img src="http://example.com?action=delete&article_id=2">
    <img src="http://example.com?action=delete&article_id=3">
    <img src="http://example.com?action=delete&article_id=4">

    Публикует такие "картинки" вот прямо здесь, в комментариях на тостере.
    При этом ваш браузер конечно попытается эти картинки получить, и выполнит эти запросы с ВАШИМИ правами.

    В случае, если вы обращаетесь к $_POST - такой фокус не сработает. Кроме того, данные отправленные через POST не попадут в историю браузера и в логи той wi-fi точки или роутера, через которую вы сидите. URL попадет, а POST data - нет. В отличие от GET.

    А $_REQUEST существует для удобства. К примеру у вас есть форма поиска, которая может работать и через POST и через GET. Это удобно, когда пользователь может скопировать URL с поисковым запросом.
    Ответ написан
    Комментировать
  • Как получить root в WinSCP?

    Для начала нужно найти файл sftp-server
    whereis sftp-server


    sftp-server: /usr/lib/sftp-server /usr/share/man/man8/sftp-server.8.gz

    Запоминаем путь!
    sudo nano /etc/sudoers

    В самом конце файла, с новой строки пишем:
    ВАШЛОГИН ALL=NOPASSWD:/usr/lib/sftp-server


    Осталась мелочь идем в свой WINSCP выбираем нужное соединение - редактировать - дополнительно - SFTP в поле дописываем sudo /usr/lib/sftp-server

    если ваш путь sudo /usr/lib/sftp-server отличается то естественно юзаем свой.
    В разных версиях дистрибьютивов бывает по разному.
    удачи
    Ответ написан
    3 комментария
  • Как задать права для linux user и www-data?

    chown -R www-data:www-data /var/www
    Ответ написан
    Комментировать
  • Компьютер без видеокарты, как установить линукс?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Вариантов несколько.
    1. Установить на другом компе на hdd, затем просто вставить в новый, не забыть поправить (стереть содержимое) /etc/udev/rules.d/70-net-чтототам.conf
    2. Вставить графическую карту на время установки.
    3. Если это сервер, очень возможно, что в нем есть чип BMC с удаленной графической консолью. Читать докумна сервер, подключаться удаленно к консоли, устанавливать как обычно.
    4. Установить с использованием консоли через COM-порт, многие дистрибутивы, особенно серверные, это позволяют. Например читать https://help.ubuntu.com/community/SerialConsoleHowto

    Во всех случаях (кроме 3) желательно после установки настроить консоль на com-порт.
    Ответ написан
    Комментировать
  • Почему файлы php скачиваются при использовании php-fpm nginx?

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

    location ~ [^/]\.php(/|$) {
                    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                    if (!-f $document_root$fastcgi_script_name) {return 404;}
                    fastcgi_param HTTP_PROXY "";
                    include fastcgi_params;
                    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
                    fastcgi_index index.php;
                    fastcgi_param SCRIPT_FILENAME $request_filename;
            }

    и важно поменять владельца файла на www-data + танцы с бубном и перезагрузка как-то все заработало
    Ответ написан
    1 комментарий
  • Как починить запуск ISO образа MacOS Monterey на VMware c AMD Ryzen™ 9 5950X?

    SSLHTML
    @SSLHTML Автор вопроса
    Изыскания, разработки, изучение
    Отвечаю на свой же вопрос. Очень опытный человек в этих делах ответил мне о том, что нужно добавить в конеч конфигурационного файла следующие строки:
    cpuid.0.eax = "0000:0000:0000:0000:0000:0000:0000:1011"
    cpuid.0.ebx = "0111:0101:0110:1110:0110:0101:0100:0111"
    cpuid.0.ecx = "0110:1100:0110:0101:0111:0100:0110:1110"
    cpuid.0.edx = "0100:1001:0110:0101:0110:1110:0110:1001"
    cpuid.1.eax = "0000:0000:0000:0001:0000:0110:0111:0001"
    cpuid.1.ebx = "0000:0010:0000:0001:0000:1000:0000:0000"
    cpuid.1.ecx = "1000:0010:1001:1000:0010:0010:0000:0011"
    cpuid.1.edx = "0000:0111:1000:1011:1111:1011:1111:1111"


    Я сразу же сказал, что делал это уже с десяток раз! Никакого толку.
    Ещё я с утратой надежды скачал готовую виртуальную машину Big Sur и запустил её. Машина запустилась (прогресс лайн побежал, а точнее пополз). И только после этого я добавил строки и попытался запустить установочный диск. По всей видимости готовая ВМ "протолкнула" что-то в VMware, т.к. ранее я уже несколько раз добавлял всё те же строки кода в конфигурационный файл, но эфекта не было.
    Нужно сохранять без всякой шляпы, которая дана везде в примерах в интернете. Без "featureCompat.enable = “FALSE”, без только одной строки "cpuid.1.eax = “0000:0000:0000:0001:0000:0110:1010:0101", и без прочей шелухи. Только так у меня заработало, а ранее, никакие примеры не помогали. Я был очень подавлен ситуацией, а сейчас вздохнул.

    ВЕСЬ КОД файла VMware virtual machine configuration (.vmx)
    .encoding = "windows-1251"
    config.version = "8"
    virtualHW.version = "19"
    pciBridge0.present = "TRUE"
    pciBridge4.present = "TRUE"
    pciBridge4.virtualDev = "pcieRootPort"
    pciBridge4.functions = "8"
    pciBridge5.present = "TRUE"
    pciBridge5.virtualDev = "pcieRootPort"
    pciBridge5.functions = "8"
    pciBridge6.present = "TRUE"
    pciBridge6.virtualDev = "pcieRootPort"
    pciBridge6.functions = "8"
    pciBridge7.present = "TRUE"
    pciBridge7.virtualDev = "pcieRootPort"
    pciBridge7.functions = "8"
    vmci0.present = "TRUE"
    hpet0.present = "TRUE"
    nvram = "macOS 13.nvram"
    virtualHW.productCompatibility = "hosted"
    powerType.powerOff = "soft"
    powerType.powerOn = "soft"
    powerType.suspend = "soft"
    powerType.reset = "soft"
    displayName = "macOS 13"
    usb.vbluetooth.startConnected = "TRUE"
    smc.present = "TRUE"
    smbios.restrictSerialCharset = "TRUE"
    firmware = "efi"
    guestOS = "darwin22-64"
    board-id.reflectHost = "TRUE"
    ich7m.present = "TRUE"
    tools.syncTime = "FALSE"
    sound.autoDetect = "TRUE"
    sound.virtualDev = "hdaudio"
    sound.fileName = "-1"
    sound.present = "TRUE"
    numvcpus = "4"
    cpuid.coresPerSocket = "4"
    memsize = "8192"
    sata0.present = "TRUE"
    sata0:0.fileName = "macOS 13.vmdk"
    sata0:0.present = "TRUE"
    sata0:1.deviceType = "cdrom-image"
    sata0:1.fileName = "C:\Users\********\Downloads\BlackArch\Monterey.iso"
    sata0:1.present = "TRUE"
    usb.present = "TRUE"
    ehci.present = "TRUE"
    usb_xhci.present = "TRUE"
    ethernet0.connectionType = "nat"
    ethernet0.addressType = "generated"
    ethernet0.virtualDev = "e1000e"
    ethernet0.present = "TRUE"
    extendedConfigFile = "macOS 13.vmxf"
    floppy0.present = "FALSE"
    smc.version = "0"
    numa.autosize.cookie = "40042"
    numa.autosize.vcpu.maxPerVirtualNode = "4"
    uuid.bios = "56 4d f7 85 83 70 f9 0d-66 3a 60 e1 f7 75 a5 35"
    uuid.location = "56 4d f7 85 83 70 f9 0d-66 3a 60 e1 f7 75 a5 35"
    sata0:0.redo = ""
    pciBridge0.pciSlotNumber = "17"
    pciBridge4.pciSlotNumber = "21"
    pciBridge5.pciSlotNumber = "22"
    pciBridge6.pciSlotNumber = "23"
    pciBridge7.pciSlotNumber = "24"
    usb.pciSlotNumber = "32"
    ethernet0.pciSlotNumber = "160"
    sound.pciSlotNumber = "33"
    ehci.pciSlotNumber = "34"
    usb_xhci.pciSlotNumber = "192"
    sata0.pciSlotNumber = "35"
    svga.vramSize = "268435456"
    vmotion.checkpointFBSize = "134217728"
    vmotion.checkpointSVGAPrimarySize = "268435456"
    vmotion.svga.mobMaxSize = "268435456"
    vmotion.svga.graphicsMemoryKB = "262144"
    ethernet0.generatedAddress = "00:0c:29:75:a5:35"
    ethernet0.generatedAddressOffset = "0"
    vmci0.id = "-143284939"
    monitor.phys_bits_used = "45"
    cleanShutdown = "TRUE"
    softPowerOff = "FALSE"
    usb_xhci:6.speed = "2"
    usb_xhci:6.present = "TRUE"
    usb_xhci:6.deviceType = "hub"
    usb_xhci:6.port = "6"
    usb_xhci:6.parent = "-1"
    usb_xhci:7.speed = "4"
    usb_xhci:7.present = "TRUE"
    usb_xhci:7.deviceType = "hub"
    usb_xhci:7.port = "7"
    usb_xhci:7.parent = "-1"
    toolsInstallManager.updateCounter = "6"
    usb:1.speed = "2"
    usb:1.present = "TRUE"
    usb:1.deviceType = "hub"
    usb:1.port = "1"
    usb:1.parent = "-1"
    cpuid.0.eax = "0000:0000:0000:0000:0000:0000:0000:1011"
    cpuid.0.ebx = "0111:0101:0110:1110:0110:0101:0100:0111"
    cpuid.0.ecx = "0110:1100:0110:0101:0111:0100:0110:1110"
    cpuid.0.edx = "0100:1001:0110:0101:0110:1110:0110:1001"
    cpuid.1.eax = "0000:0000:0000:0001:0000:0110:0111:0001"
    cpuid.1.ebx = "0000:0010:0000:0001:0000:1000:0000:0000"
    cpuid.1.ecx = "1000:0010:1001:1000:0010:0010:0000:0011"
    cpuid.1.edx = "0000:0111:1000:1011:1111:1011:1111:1111"
    usb_xhci:4.present = "TRUE"
    usb_xhci:4.deviceType = "hid"
    usb_xhci:4.port = "4"
    usb_xhci:4.parent = "-1"
    toolsInstallManager.lastInstallError = "21004"
    Ответ написан
    3 комментария
  • Как получить высоту блока от верха страницы jquery или js?

    cimmwolf
    @cimmwolf
    Веб-разработчик
    В jQuery есть специальный метод .offset() для получения координат элемента относительно документа. Чтобы получить расстояние от верха страницы до шапки используйте вот такой код: $('<селектор шапки>').offset().top

    На чистом Javascript всё немного сложнее. Сначала нужно получить координаты объекта на странице с помощью getBoundingClientRect() а после этого прибавить к этим координатам значение скроллинга. Вот функция, которая работает аналогично jQuery.offset() (взято здесь):
    function offset(el) {
        var rect = el.getBoundingClientRect(),
        scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
        scrollTop = window.pageYOffset || document.documentElement.scrollTop;
        return { top: rect.top + scrollTop, left: rect.left + scrollLeft }
    }
    Ответ написан
    Комментировать
  • Как записать разговор на iPhone?

    @smartlight
    Apple не разрешает записывать разговоры на iphone, т.к. это нарушает права собеседника(помоему такая трактовка). поэтому нету ПО. и врядли будет. это самый жирный минус iphone.
    Ответ написан
    1 комментарий
  • Как вернуть 2 значения в PHP return?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Вариант 1 - Деструктуризация:
    // Возврат нескольких значений:
    function some() {
        return [23, 42];
    }
    
    // Получение
    [$a, $b] = some();
    
    \var_dump($a, $b);


    Вариант 2 - Деструктуризация с ключами:
    // Возврат нескольких значений:
    function some() {
        return ['a' => 23, 'b' => 42];
    }
    
    // Получение
    ['a' => $a, 'b' => $b] = some();
    
    \var_dump($a, $b);


    Вариант 3 - Генераторы с ключами:
    function some() {
        yield 'a' => 23;
        yield 'b' => 42;
    }
    
    foreach (some() as $key => $value) {
      echo $key . ':' . $value; // a:23 b:42
    }


    Вариант 4 - Генераторы без ключей:
    function some() {
        yield 23;
        yield 42;
    }
    
    foreach (some() as $value) {
      echo $value; // 23 42
    }


    Вариант 5 - Генераторы с возвратом:
    function some() {
        yield 23;
        return 42;
    }
    
    $value = some();
    echo $value->current(); // 23
    $value->next();
    echo $value->getReturn(); // 42


    Вариант 6 - DTO:
    class DataTransferObject
    {
        private $a;
        private $b;
    
        public function __construct($a, $b)
        {
            $this->a = $a;
            $this->b = $b;
        }
    
        public function getA()
        {
            return $this->a;
        }
    
        public function getB()
        {
            return $this->b;
        }
    }
    
    function some() {
        return new DataTransferObject(23, 42);
    }
    
    $value = some();
    echo $value->getA(); // 23
    echo $value->getB(); // 42


    И ещё куча всяких вариантов, но мне влом придумывать уже)
    Ответ написан
    4 комментария
  • Как удалить дубликаты из json?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    arr = Array.from(new Set(arr));
    Ответ написан
    Комментировать