LINUX.ORG.RU

PHP 8.1

 

PHP 8.1

2

2

Состоялся релиз PHP 8.1 — языка программирования общего назначения, под управлением которого, согласно данным w3techs, работают порядка 78 % сайтов. Среди основных изменений в новой версии стоит отметить добавление перечислений, «зелёных» потоков и интерсекционных типов.

Новая функциональность

Enums

Добавлены перечисления, которые базируются на классах и объектах (поэтому оператор проверки типа instanceof работает и с ними). Перечисления вмещают ряд констант. Но что самое важное, перечисления создают отдельный тип, с которым уже можно работать.

Пример работы с перечислениями, взятый из RFC:

enum Suit { 
  case Hearts; 
  case Diamonds; 
  case Clubs; 
  case Spades; 
} 

function pick_a_card(Suit $suit) { ... } 

$val = Suit::Diamonds; 

pick_a_card($val);        // OK 
pick_a_card(Suit::Clubs); // OK 
pick_a_card('Spades');    // TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given 

Поскольку элементы перечисления объекты, то они не могут быть меньше или больше других таких элементов.

У элементов перечислений есть также свойство «name», которое хранит имя, хоть оно и является артефактом реализации, поэтому его стоит использовать для отладки.

Подкреплённые перечисления

По умолчанию элементы перечислений не имеют скалярного типа, но всё же его можно объявить при создании перечисления (доступно только для int или string):

enum Suit: string { 
  case Hearts = 'H'; 
  case Diamonds = 'D'; 
  case Clubs = 'C'; 
  case Spades = 'S'; 
} 

Такие значения называются подкреплёнными (backed), ведь значение «подкрепляются» более простым скалярным типом.

Также доступно свойство только для чтения «value», хранящее значение.

Подкреплённые перечисления реализуют интерфейс BackedEnum, который определяет два метода:

  • from(int|string): self принимает скалярный тип и возвращает соответствующее значение перечисления (Enum Case), а если такого нет, то будет выброшена ошибка типа ValueError;

  • tryFrom(int|string): ?self аналогичен первому методу, только теперь ошибка не будет выброшена, а просто возвратится null.

Интерфейсы, трейты и методы в перечислениях

Перечисление может вмещать методы (причём даже статические), а также использовать трейты.

Если перечисление реализует какой-то интерфейс, то все элементы перечисления пройдут проверку на тип, реализующий этот интерфейс:


interface Colorful { 
  public function color(): string; 
} 

enum Suit implements Colorful { 
  case Hearts; 
  case Diamonds; 
  case Clubs; 
  case Spades; 

  // Fulfills the interface contract. 

  public function color(): string { 
    return match($this) { 
      Suit::Hearts, Suit::Diamonds => 'Red', 
      Suit::Clubs, Suit::Spades => 'Black', 
    }; 
  } 

  // Not part of an interface; that's fine. 
  public function shape(): string { 
    return "Rectangle"; 
  } 
} 

function paint(Colorful $c) { ... } 

paint(Suit::Clubs);  // Works 

print Suit::Diamonds->shape(); // "rectangle" 

Перечисление значений

Также перечисления реализуют метод cases(), возвращающий список объектов перечисления:

Suit::cases(); 

// [Suit::Hearts, Suit::Diamonds, Suit::Clubs, Suit:Spades] 

Интерсекционные типы

В противовес союзным типам в РНР 8.0, добавлена возможность указания более точных типов, путём их объединения при помощи логического «и». Это достигается благодаря комбинации имён классов или интерфейсов при помощи амперсанда & (пример из php.watch):

function count_and_iterate(Iterator&\Countable $value) { 
    foreach($value as $val) {} 
    count($value); 
} 

Поддерживаются только чистые интерсекционные типы, без композиции с nullable или союзными типами. Кроме того, поддерживаются только имена классов и интерфейсов.

Нити

Добавлены файберы, предоставляющие низкоуровневый интерфейс для создания «зелёных потоков». Нити позволяют управлять параллельными процессами в пределах одного физического процесса. То есть, де-факто не будет двух участков кода, выполняющихся в один момент времени, но файберы позволяют выполнять действия в момент, пока один участок кода простаивает.

Возвращаемый тип never

Добавлена возможность объявить возвращаемый функцией тип как never, если она всегда вызывает остановку программы. Этого можно достичь, вызывая в этой функции конструкцию exit или die. Пример из PHP.Watch


function redirect(string $url): never { 
    header('Location: ' . $url); 
    exit(); 
} 

Цель этого изменения — указать, что вызов определённой функции гарантированно остановит выполнение программы.

final для констант класса

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

class Foo { 
    final public const X = "foo"; 
} 

class Bar extends Foo { 
    public const X = "bar"; 
} 

// Fatal error: Bar::X cannot override final constant Foo::X 

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

Свойства только для чтения

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

class Test {
    public readonly string $prop;
 
    public function __construct(string $prop) {
        // Заполнение readonly-свойства
        $this->prop = $prop;
    }
}
 
$test = new Test("foobar");
// Так можно
var_dump($test->prop); // string(6) "foobar"
 
// А так нельзя, пускай значение и совпадает
$test->prop = "foobar";
// Error: Cannot modify readonly property Test::$prop

Ключевое слово readonly можно использовать только с типизированным свойством. Инициализация свойства только для чтения может происходить только в классе, содержащем это свойство.

При попытке повторного установления значения или удаления переменной будет выброшено исключение типа Error.

Кроме этого:

  • Добавлены функции:
    • fsync: синхронизация изменений в файле (включая метадату);
    • fdatasync: синхронизация изменений в файле без метадаты;
    • array_is_list: проверяет, является ли массив списком;
    • Функции для поддержки потокового шифрования XChaCha20 в Sodium;
  • Добавлено новое поле full_path в суперглобальном массиве $_FILES, хранящее полный путь к файлам, который был передан браузером;
  • Синтаксис first-class callable;
  • Новый атрибут #[ReturnTypeWillChange];
  • Оператор распаковки массивов теперь поддерживает массивы со строковыми ключами;
  • Добавлена поддержка алгоритмов хеширования xxHash и MurmurHash3;
  • Добавлен новый параметр $options для функций хеширования для определения алгоритмоспецифичных дополнительных опций;
  • Добавлена поддержка префикса 0o/0O для восьмеричных чисел;
  • Новый класс IntlDatePatternGenerator, позволяющий лучше поддерживать локализованные даты;
  • В phar добавлена поддержка алгоритмов подписи OpenSSL-256 и OpenSSL-512;
  • В расширение mysqli добавлена константа MYSQLI_REFRESH_REPLICA аналогичная уже существующей константе MYSQLI_REFRESH_SLAVE, это сделано из-за того, что в MySQL версии 8.0.23 некоторые опции, содержащие слова «slave», были признаны устаревшимы и заменены на аналогичные с «replica». Тем не менее MYSQLI_REFRESH_SLAVE в РНР устаревшей не признана и планов по удалению этой константы нет;
  • GD:
  • Curl:
    • Добавлена поддержка DNS-over-HTTPS;
    • Добавлен класс CURLStringFile, позволяющий осуществлять загрузку файла путём отправки его содержимого.

Изменения

Ограничение использования суперглобального массива $GLOBALS

Суперглобальный массив $GLOBALS, хранящий пары имя_переменной => ссылка_на_переменную больше нельзя передавать по ссылке, приравнивать его к пустому массиву или ссылке на переменную.

// Будет работать:
foreach ($GLOBALS as $var => $value) {
    echo "$var => $value\n";
}
$GLOBALS['x'] = 1;
$GLOBALS['x']++;
isset($GLOBALS['x']);
unset($GLOBALS['x']);
// ...что угодно, используя $GLOBALS['x'].

// Выдаёт ошибку времени компиляции:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
// ...и другие подобные операции чтения-записи над $GLOBALS

// Выдаёт исключения типа Error во время исполнения:
by_ref($GLOBALS);

А также:

  • Функции для работы HTML теперь будут обрабатывать одинарные кавычки ', а невалидные символы теперь будут просто заменены на � (U+FFFD);
  • Теперь класс SplFixedArray реализует интерфейс JsonSerializable, что позволит функции json_encode воспринимать его как массив;
  • Режим интерактивной оболочки (php -a) теперь требует наличия расширения readline;
  • Функции fputcsv и SplFileObject::fputcsv теперь могут принимать новый параметр, оборачивающий конец строки;
  • Функция version_compare() теперь не может принимать частичные значения для операторов;
  • Функция compact() теперь выбрасывает предупреждение, если типы её параметров отличались от массива и строки;
  • Разрешено использование ключевого слова new в параметрах функции по умолчанию, аргументах атрибутов, инициализаторах статических переменных и глобальных констант;
  • Благодаря изменениям в работе OPcache, производительность была повышена на 0.5-8%;
  • В phar алгоритм подписи по умолчанию изменён с SHA1 на SHA256;
  • Расширение MySQLi теперь использует режим выброса исключений при возникновении ошибки;
  • Следующие ресурсы стали объектами:
    • file_info => finfo
    • imap => IMAP\Connection
    • ftp => FTP\Connection
    • Функция imageloadfont теперь возвращает экземпляр класса GdFont
    • Ресурсы LDAP мигрировали в экземпляры классов LDAP\Connection, LDAP\Result и LDAP\ResultEntry
    • Ресурсы PostgreSQL мигрировали в экземпляры классов PgSql\Connection, PgSql\Result и PgSql\Lob
    • pspell => PSpell\Dictionary, pspell config => PSpell\Config

Объявлено устаревшим

>>> Подробности

★★★

Проверено: sudopacman ()
Последнее исправление: sudopacman (всего исправлений: 22)
Ответ на: комментарий от fernandos

Ты удивлялся тому, что петонисты не пишут роутинг:

За пистонистами я такого не наблюдаю.

Там роутинг есть из коробки?

и рассказывал, как легко и просто его сделать на пхп:

РНР предоставляет средства, чтобы всё это сделать максимально удобно.

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

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Что за бред вы пишете?

Ты удивлялся тому, что петонисты не пишут роутинг:

Особенно разработчики джанго и фласка роутинг не пишут.

и рассказывал, как легко и просто его сделать на пхп:

Так и есть.

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

Нет. Вы вообще смысл беседы потеряли?

fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

Особенно разработчики джанго и фласка роутинг не пишут.

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

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

Нет.

Хорошо. А к какому выводу тогда легко придти?

Вы вообще смысл беседы потеряли?

Да, нет, я помню! Мы обсуждаем, зачем нужен пхп в 2К21.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Хорошо. А к какому выводу тогда легко придти?

Отдельный представитель сообщества решил навелосипедить роутинг.

fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

Братан, с таким подходом ты срача не построишь.

LamerOk ★★★★★
()
25 ноября 2021 г.
Ответ на: комментарий от fernandos

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

Все по unix-вею.

anonymous
()
Ответ на: комментарий от anonymous

Один Пхп никогда нигде не используется, а в связке с веб-сервером

При разработке используется.

Все по unix-вею.

 Сова 
  ⬇
Глобус
fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

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

anonymous
()
Ответ на: комментарий от anonymous

Речь про роутинг уровня говнокода спуфинга.

fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

При разработке используется.

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

Но вообще тенденция для php закономерная - авторы фреймворков любят велосипедить не только функционал веб-сервера (скоро дойдут прослушивание https-порта на пхп писать) но и функционал самого пхп: вместо готовой функции из ядра пхп пишут свою её реализацию на скриптах с 10 обёртками (для совместимости с самими собой) вокруг.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Ну, сами виноваты кто так делает

Виноваты в чём? В использовании удобного средства? Во сволочи, да?

Веб-сервер ту же задачу выполняет быстрее (он на си)

Я вам по секрету скажу, при разработке скорость непосредственной работы на встроенном веб-сервере не является приоритетной, всё равно в проде используется что-то нормальное. А веб-сервер ПХП тоже на си.

надёжнее

Я вам по секрету скажу, при разработке, надёжность на встроенном веб-сервере не является приоритетной, всё равно в проде используется что-то нормальное.

и универсальнее чем пхп-скрипты

Веб-сервер универсальнее чем пхп-скрипты? Вы в своём уме?

Но вообще тенденция для php закономерная - авторы фреймворков любят велосипедить не только функционал веб-сервера

Вы бредите что ли? Какие к чёрту авторы фрейворков любят велосипедить не только функциональность (словарь откройте) веб-сервера? У РНР встроенный веб-сервер есть. https://www.php.net/manual/en/features.commandline.webserver.php

но и функционал самого пхп: вместо готовой функции из ядра пхп пишут свою её реализацию на скриптах с 10 обёртками (для совместимости с самими собой) вокруг.

Чтобы что?

fernandos ★★★
() автор топика
Ответ на: комментарий от firkax

Насчёт тенденции соглашусь отчасти. Но есть задачи, когда оправданно использовать те же Swoole/Swoft.

northerner ★★★
()
Ответ на: комментарий от fernandos

... ты тупой?

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

аноним> веб-сервера умеют роутинг нативно
fernandos> встроенный вебсервер появился только с 5.4 и он не умеет
аноним> я про настоящий сервер а не про встроенный
fernandos> да нет же, мы хотим встроенный и он не умеет
я> ну сами виноваты что используете фейковый сервер, если бы использовали нормальный то он бы всё умел
fernandos> ты чё, не знаешь что в пхп есть встроенный? вот тебе ссылка на мануал, и да, он всем хорош

Разъясню ещё раз для тупых: речь шла о том, что пхп-кодеры велосипедят фукционал веб-сервера (парсинг урла и роутинг) скриптами, написанными на пхп. И о том, что нормальный веб-сервер (НЕТ, НЕ ВСТРОЕННЫЙ, про него все знают но он тут не нужен) умеет роутинг нативно.

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

Чтобы что?

Я думаю они и сами внятно ответить не смогут, зачем они это делают. Но делают.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Прекратите тупить. Роутниг уровня «откроем index.php в каталоге Н» никому не нужен, о чём я анониму и сказал.

Разъясню ещё раз для тупых: речь шла о том, что пхп-кодеры велосипедят фукционал веб-сервера скриптами, написанными на пхп. И о том, что нормальный веб-сервер (НЕТ, НЕ ВСТРОЕННЫЙ, про него все знают но он тут не нужен) умеет роутинг нативно.

Да, прямо умеет? Покажите мне веб-сервер, который умеет в полноценный роутинг уровня ларавел или yii. Ну и настраиваться это должно нормально. И ещё б middleware, но это уже так, по желанию.

Соответственно костыльный скриптовый роутинг мазохисты могут себе делать для dev-окружения, если хотят, но в проде он не нужен - там есть веб-сервер для этого

Вы сложнее directory-based routing ничего в жизни не видели?

fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

Не обязательно index.php.

Есть входящий урл, он парсится префиксными сравнениями и регулярками, на выходе получается путь к обработчику этого урла и произвольные параметры для обработчика (можно передавать либо в $_GET либо в $_SERVER).

Ну и настраиваться это должно нормально.

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

Вы сложнее directory-based routing ничего в жизни не видели?

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Разъясню ещё раз для тупых: речь шла о том, что пхп-кодеры велосипедят фукционал веб-сервера (парсинг урла и роутинг) скриптами

А как ты собрался в своем коде различать какой и откуда запрос тебе пришел ?

Приведи мне в пример хотя бы один ЯП, в котором запросы ‘https://example.com/?page=1’ и ‘https://example.com/?page=2’ внутри кода выглядят по-иному нежели что-то типа int page=GET(‘page’) - или у тебя есть какая-то особая магия позволяющая парсить урлы ?

windows10 ★★★★★
()
Ответ на: комментарий от firkax

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

Конечно же проблема. Как этическая (только ДЫБИЛ будет перегенировать целый конфиг вебсервера при добавлении условной новой категории в интернет-магазине), так и функциональная (апач хотя бы через .htaccess это поддерживает) - а твой нжинкс мало того что должен иметь доступ на изменение файла конфига, а значит траходром с правами, так еще и положит ВЕСЬ ВЕБ в момент перезапуска чтобы подхватить новый конфиг. Вот это как раз лечение поноса затыканием жопы.

Я уже молчу за то, что кроме нжинкса существуют еще как минимум apache, lighttpd, litespeed.

windows10 ★★★★★
()
Ответ на: комментарий от windows10

?page= попадает в $_GET['page'], только это не роутинг уже

Но если хочешь странного то роутинг по get-параметру (и даже по кукам) nginx тоже сможет.

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

anonymous
()
Ответ на: комментарий от firkax

Есть входящий урл, он парсится префиксными сравнениями и регулярками, на выходе получается путь к обработчику этого урла и произвольные параметры для обработчика (можно передавать либо в $_GET либо в $_SERVER).

Вы хоть можете представить, насколько это сложнее, чем пхп-роутинг? Насколько это сложнее отлаживать?

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

Всё равно будет каша. Просто сравните это с ларавеловским роутингом с DI, middleware и прочими плюшками.

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

Банальное middleware с проверкой csrf. Это часть роутинга.

fernandos ★★★
() автор топика
Ответ на: комментарий от windows10

апач

Закопай уже.

только ДЫБИЛ будет перегенировать целый конфиг вебсервера при добавлении условной новой категории в интернет-магазине

В чём собственно проблема? И что значит «целый конфиг»? Это что-то запредельное?

а твой нжинкс мало того что должен иметь доступ на изменение файла конфига

Не должен.

так еще и положит ВЕСЬ ВЕБ в момент перезапуска чтобы подхватить новый конфиг

Не положит и не надо его для этого перезапускать.

Вобщем, учись пользоваться адекватными инструментами, а не только пыхокодерству.

Я уже молчу за то, что кроме нжинкса существуют еще как минимум apache, lighttpd, litespeed.

Апач не нужен, это доисторическое легаси. Про остальные не смотрел, они либо поддерживают всё то же самое, либо тоже не нужны.

firkax ★★★★★
()
Ответ на: комментарий от fernandos

Вы хоть можете представить, насколько это сложнее, чем пхп-роутинг? Насколько это сложнее отлаживать?

Не сложнее (ну, если ты готов вылезти за пределы пхп-кодинга). Отлаживать - распарсенный запрос можно писать в nginx-лог.

Всё равно будет каша

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

Банальное middleware с проверкой csrf. Это часть роутинга.

csrf-токен? Ну, да, наверно не получится. Впрочем никто не заставляет его делать частью роутинга, можно ж и отдельно. Хотя, раз это такая частая задача, возможно есть какие-то nginx-модули для этого, или можно свой написать.

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

Прямо-таки вижу лицо программиста, отлаживающего этот конфигуратор.

csrf-токен? Ну, да, наверно не получится. Впрочем никто не заставляет его делать частью роутинга, можно ж и отдельно. Хотя, раз это такая частая задача, возможно есть какие-то nginx-модули для этого, или можно свой написать.

Что вы, что вы, всё же есть.

В ларавеле, к слову, роутинг не просто так является частью фреймворка, просто это удобно.

fernandos ★★★
() автор топика
Ответ на: комментарий от firkax

Но если хочешь странного то роутинг по get-параметру (и даже по кукам) nginx тоже сможет.

Забудь за nginx. Это не единственный веб-сервер на планете, и уж явно не самый поддерживаемый.

Закопай уже.

Это ты расскажешь своим клиентам, которые захотят поставить плагин от ФБ который работает через htaccess. Это ты расскажешь клиентам которые хотят панель управления WHM\Cpanel. И так далее. А на своем локалхосте твори чего душа пожелает.

В чём собственно проблема? И что значит «целый конфиг»? Это что-то запредельное?

Проблема в том, что конфиг nginx ОДИН ЕДИНСТВЕННЫЙ, и обрабатывается как один единственный. А значит должен иметь права на запись для того пользователя, под которым работает веб, чтобы твоя ЦМСка могла делать в нем изменения. Но если ты откроешь конфиг вебсервера на запись для www, то о секюрности можешь забыть, тогда уже ставь сразу 777 на /etc.

Не должен.

Должен. Иначе

Сгенерировать конфиг для nginx

будет

ntfs@gideon:/$ echo "New rule" >> /etc/nginx/nginx.conf
bash: /etc/nginx/nginx.conf: Permission denied
ntfs@gideon:/$ 

Или ты сейчас героически бросишься решать созданные тобой же проблемы в области редактирования системных файлов и рестарте сервисов ?

Не положит и не надо его для этого перезапускать.

После внесения изменений к конфиг нжинкса, его не нужно перезапускать ? Свободен.

windows10 ★★★★★
()
Ответ на: комментарий от windows10

Я конечно понимаю, что судя по

плагин от ФБ

панель управления WHM\Cpanel

echo «New rule» >> /etc/nginx/nginx.conf

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

Забудь за nginx. Это не единственный веб-сервер на планете, и уж явно не самый поддерживаемый.

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

Проблема в том,

Должен. Иначе

После внесения изменений к конфиг нжинкса, его не нужно перезапускать ?

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

я же запретил постинг погапе говнокода на моем лоре

GP
()
Ответ на: комментарий от firkax

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

После этих и других слов можно смело отправлять все твои сообщения в /dev/null без захода из в мозг)

Что есть нормальный проект?

Является ли им личный проект гражданина И., который создал личный сайт с использованием связки php/apache с кучей всего от блога до системы управления домом для своей семьи?

В небольшом городе Н. общество «Помощь раковым больным города Н.» разработала проект сайта со всем необходимым функционалом. Связка php/apache. Является ли этот проект нормальным?

anonymous
()
Ответ на: комментарий от LamerOk

Да, нет, я помню! Мы обсуждаем, зачем нужен пхп в 2К21.

большая часть языков из TIOBE в 2021 не нужна, но легаси, карл…

anonymous
()
Ответ на: комментарий от anonymous

Не надо придираться на ровном месте. Очевидно что речь про техническую сторону шла, а не про контент.

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

firkax ★★★★★
()
Ответ на: комментарий от windows10

В DRF достаточно в наследнике класса ModelViewset переопределить метод get_queryset типа такого:

page = self.request.query_params['page']
if page is not None:
  queryset = self.queryset.filter(page = page)
return queryset

LongLiveUbuntu ★★★★★
()
Последнее исправление: LongLiveUbuntu (всего исправлений: 1)
Ответ на: комментарий от LongLiveUbuntu

В DRF достаточно в наследнике класса ModelViewset переопределить метод get_queryset типа такого:

Еще раз, чем отличается page = self.request.query_params[‘page’] от $page=$_GET[‘page’] ?

Оно тебе что-то другое вернет из строки урла ?

windows10 ★★★★★
()
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от firkax

Я в курсе что мир полон пых-велосипедистов. Но от этого они правильнее не становятся.

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

Bonio
()
Ответ на: комментарий от Bonio

Это говорит человек, предлагающий перегенирировать конфиги nginx в зависимости от состояния веб приложения.

Я такого, в такой общей формулировке, не предлагал.

firkax ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.