Как в PHP очистить память?
В PHP память очищается автоматически после окончания выполнения скрипта. Однако, есть несколько способов управлять памятью для оптимизации работы скрипта:
1. Очистка переменных: Удалив все ссылки на объект или массив, PHP автоматически освободит память, занимаемую ими. Использование функции `unset()` позволяет явно удалить переменную или ее элементы.
2. Освобождение памяти после работы с большими массивами: Для этого можно использовать функцию `unset()` или присвоить переменной пустое значение (`$var = null`), чтобы удалить ссылку на массив и освободить память.
3. Использование `unset()` после работы с объектами: Аналогично предыдущему пункту, нужно удалить ссылку на объект, чтобы очистить память. Если объект был инициализирован с помощью конструктора, то вызов `unset()` может привести к вызову деструктора объекта.
4. Использование `gc_collect_cycles()`: Функция `gc_collect_cycles()` используется для принудительного вызова сборщика мусора, который освобождает память, занимаемую неиспользуемыми объектами и циклами ссылок.
5. Управление памятью экстенсионных функций: Если используются расширения PHP, следует обратить внимание на их документацию, так как некоторые расширения могут предоставлять специальные функции для управления памятью.
Но в целом, в PHP не требуется явно очищать память, так как это автоматически выполняется сборщиком мусора. Однако, правила управления памятью в PHP важно понимать, чтобы написанный код был максимально эффективным и не вызывал утечек памяти.
#вопросы_с_собеседований
В PHP память очищается автоматически после окончания выполнения скрипта. Однако, есть несколько способов управлять памятью для оптимизации работы скрипта:
1. Очистка переменных: Удалив все ссылки на объект или массив, PHP автоматически освободит память, занимаемую ими. Использование функции `unset()` позволяет явно удалить переменную или ее элементы.
2. Освобождение памяти после работы с большими массивами: Для этого можно использовать функцию `unset()` или присвоить переменной пустое значение (`$var = null`), чтобы удалить ссылку на массив и освободить память.
3. Использование `unset()` после работы с объектами: Аналогично предыдущему пункту, нужно удалить ссылку на объект, чтобы очистить память. Если объект был инициализирован с помощью конструктора, то вызов `unset()` может привести к вызову деструктора объекта.
4. Использование `gc_collect_cycles()`: Функция `gc_collect_cycles()` используется для принудительного вызова сборщика мусора, который освобождает память, занимаемую неиспользуемыми объектами и циклами ссылок.
5. Управление памятью экстенсионных функций: Если используются расширения PHP, следует обратить внимание на их документацию, так как некоторые расширения могут предоставлять специальные функции для управления памятью.
Но в целом, в PHP не требуется явно очищать память, так как это автоматически выполняется сборщиком мусора. Однако, правила управления памятью в PHP важно понимать, чтобы написанный код был максимально эффективным и не вызывал утечек памяти.
#вопросы_с_собеседований
👍3
Читаемые end-to-end тесты для PHPStan с помощью bashunit
Статья описывает опыт использования end-to-end тестов в проекте PHPStan, который разрабатывается на языке PHP и предназначен для статического анализа кода. Основной акцент делается на том, как эти тесты реализованы с помощью bash-скриптов и GitHub Actions, а также на преимуществах такого подхода.
Статья описывает опыт использования end-to-end тестов в проекте PHPStan, который разрабатывается на языке PHP и предназначен для статического анализа кода. Основной акцент делается на том, как эти тесты реализованы с помощью bash-скриптов и GitHub Actions, а также на преимуществах такого подхода.
My developer experience
Readable end-to-end tests for PHPStan with bashunit
For a long time in the PHPStan repository, we have isolated, highly-parallel end-to-end tests which are written in bash utilizing GitHub Actions. The design and initial implementation - as far as I know - has been done by Ondřej Mirtes.
👍2
PHP 8.4: Новые функции поиска в массиве. Пишем с нуля
В PHP 8.4 планируется добавить новые функции массива: array_find, array_find_key, array_any и array_all, которые являются вспомогательными функциями для общих шаблонов проверки массива на наличие элементов, соответствующих определенному условию.
В настоящее время существует несколько функций, обрабатывающих массивы с использованием обратного вызова. Однако по-прежнему отсутствуют функции для поиска отдельного элемента, соответствующего условию, и тесно связанные функции проверки наличия элементов, соответствующих условию. Реализовать эти функции в среде пользователей относительно просто, но они часто требуются, что приводит к тому, что колесо изобретается снова и снова. Кроме того, функции такого типа реализованы и в других языках программирования, таких как Rust, JavaScript или C++.
Поэтому есть причина включить эти функции в стандартную комплектацию следующей версии PHP. Кроме того, реализация этих функций очень похожа на array_filter и относительно проста в реализации, поэтому затраты на обслуживание должны быть низкими.
В PHP 8.4 планируется добавить новые функции массива: array_find, array_find_key, array_any и array_all, которые являются вспомогательными функциями для общих шаблонов проверки массива на наличие элементов, соответствующих определенному условию.
В настоящее время существует несколько функций, обрабатывающих массивы с использованием обратного вызова. Однако по-прежнему отсутствуют функции для поиска отдельного элемента, соответствующего условию, и тесно связанные функции проверки наличия элементов, соответствующих условию. Реализовать эти функции в среде пользователей относительно просто, но они часто требуются, что приводит к тому, что колесо изобретается снова и снова. Кроме того, функции такого типа реализованы и в других языках программирования, таких как Rust, JavaScript или C++.
Поэтому есть причина включить эти функции в стандартную комплектацию следующей версии PHP. Кроме того, реализация этих функций очень похожа на array_filter и относительно проста в реализации, поэтому затраты на обслуживание должны быть низкими.
Хабр
PHP 8.4: Новые функции поиска в массиве. Пишем с нуля
В PHP 8.4 планируется добавить новые функции массива: array_find, array_find_key, array_any и array_all , которые являются вспомогательными функциями для общих шаблонов проверки массива на наличие...
👍17🥰6🔥3
Практическое логирование для PHP-приложений с помощью OpenTelemetry
Это самый полный гайд по логированию в PHP с использованием OpenTelemetry
Это самый полный гайд по логированию в PHP с использованием OpenTelemetry
Betterstack
Practical Logging for PHP Applications with OpenTelemetry | Better Stack Community
Learn how to use the OpenTelemetry framework to instrument your PHP applications with code that gathers log data for observability pipelines
👍4
#хочу_спросить
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
PHP Static Analysis Attributes
Этот пакет позволяет использовать атрибуты вместо аннотаций PHPDoc для статического анализа с помощью PHPStan.
Этот пакет позволяет использовать атрибуты вместо аннотаций PHPDoc для статического анализа с помощью PHPStan.
GitHub
GitHub - php-static-analysis/attributes: Attributes used for static analysis
Attributes used for static analysis. Contribute to php-static-analysis/attributes development by creating an account on GitHub.
👍6❤1
Что означает сложность алгоритма?
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
#вопросы_с_собеседований
Сложность алгоритма представляет собой меру его эффективности и определяет количество ресурсов, таких как время и память, необходимых для его выполнения.
Существуют два основных типа сложности алгоритма: временная сложность и пространственная сложность.
Временная сложность алгоритма оценивает время, необходимое для его выполнения, в зависимости от размера входных данных. Обычно время выполнения алгоритма измеряется в тактах процессора или в секундах. Примеры временной сложности включают константную сложность O(1) (выполнение за постоянное время), линейную сложность O(n) (выполнение занимает время, пропорциональное размеру входных данных) и квадратичную сложность O(n^2) (выполнение занимает время, пропорциональное квадрату размера входных данных).
Пространственная сложность алгоритма оценивает объем памяти, необходимый для его выполнения, в зависимости от размера входных данных. Обычно пространственная сложность измеряется в байтах. Примеры пространственной сложности включают константную сложность O(1) (не зависит от размера входных данных), линейную сложность O(n) (потребляет память, пропорционально размеру входных данных) и квадратичную сложность O(n^2) (потребляет память, пропорционально квадрату размера входных данных).
#вопросы_с_собеседований
👏3😢1
WeakMaps — скрытая жемчужина в PHP
Компания работает над новой функцией для Flare и столкнулась с задачей оптимизации хранения элементов в массиве. Ранее элементы просто добавлялись в массив, и при превышении лимита удалялся самый старый элемент.
Сложность возросла, когда потребовалось создать структуру узлов (Node), где каждый узел может содержать дочерние узлы и элементы. Для нахождения нужного узла использовался MagicNodeFinder, но при удалении элементов возникли проблемы: не было способа точно определить, в каком узле находится элемент, что приводило к неэффективному обходу дерева.
Решение пришло с использованием WeakMap, нового в PHP 8.0. WeakMap позволяет хранить объекты без увеличения их ссылочного счетчика, поэтому при удалении объекта из памяти, он автоматически удаляется и из WeakMap. Это позволило легко управлять элементами в узлах без необходимости обхода дерева при удалении.
Использование WeakMap улучшило производительность и упростило код. Теперь, когда элемент удаляется из массива, он автоматически удаляется и из WeakMap узла.
Компания работает над новой функцией для Flare и столкнулась с задачей оптимизации хранения элементов в массиве. Ранее элементы просто добавлялись в массив, и при превышении лимита удалялся самый старый элемент.
Сложность возросла, когда потребовалось создать структуру узлов (Node), где каждый узел может содержать дочерние узлы и элементы. Для нахождения нужного узла использовался MagicNodeFinder, но при удалении элементов возникли проблемы: не было способа точно определить, в каком узле находится элемент, что приводило к неэффективному обходу дерева.
Решение пришло с использованием WeakMap, нового в PHP 8.0. WeakMap позволяет хранить объекты без увеличения их ссылочного счетчика, поэтому при удалении объекта из памяти, он автоматически удаляется и из WeakMap. Это позволило легко управлять элементами в узлах без необходимости обхода дерева при удалении.
Использование WeakMap улучшило производительность и упростило код. Теперь, когда элемент удаляется из массива, он автоматически удаляется и из WeakMap узла.
👍3🔥2❤1💯1
Анонимные и стрелочные функции: как использовать их вместо create_function в PHP 8
В статье рассказано, как команда проводила рефакторинг кода при переходе с PHP 7.4 на PHP 8 и на что заменили одну из самых популярных функций — create_function.
В статье рассказано, как команда проводила рефакторинг кода при переходе с PHP 7.4 на PHP 8 и на что заменили одну из самых популярных функций — create_function.
Хабр
Анонимные и стрелочные функции: как использовать их вместо create_function в PHP 8
Привет, Хабр! Меня зовут Виталий Киреев, я руководитель разработки SpaceWeb. В статье расскажу, как мы с командой проводили рефакторинг кода при переходе с PHP 7.4 на PHP 8 и на что заменили одну из...
🌚9🥱5👍4😁2
Сколько раз в неделю вы ездите в офис? Вы бы хотели перейти на удалёнку?
#интерактив
#интерактив
Использование Temporal для эффективного управления жизненным циклом документов
В современном мире важно эффективно управлять большими объемами данных и сложными рабочими процессами. Temporal.io предлагает мощное решение для создания масштабируемых и надежных рабочих процессов. Рассмотрим, как использовать Temporal для управления жизненным циклом документов, обрабатывая изменения документов без перегрузки системы.
Проблема
Представьте, что нужно отслеживать изменения файлов или документов. Эти документы обычно неактивны и не потребляют много ресурсов, пока пользователь не внесет изменения или не загрузит новый файл. В этот момент начинается активная работа системы. Некоторые процессы (например, создание сводок с помощью ИИ) не могут выполняться одновременно с активностью пользователя и должны накапливать изменения или ждать завершения работы.
Решение
Temporal позволяет создавать таймеры и обработчики событий, что помогает управлять сложными состояниями и наблюдать за событиями. Это обеспечивает чистую и последовательную обработку изменений документов без лишней нагрузки на ресурсы.
Шаги реализации:
📋 Предпосылки: Определите основные классы для событий и очередей событий.
🛠️ Создание базового рабочего процесса: Создайте Workflow с методами для сигналов и запуска.
📤 Отправка событий в Workflow: Реализуйте метод для отправки событий в Workflow.
⏱️ Введение таймеров: Добавьте таймеры для более эффективного управления поведением пользователей.
🔄 Продолжение как новый: Реализуйте механизм перезапуска Workflow при достижении лимита истории.
🚀 Продвинутые таймеры и дедупликация: Реализуйте RollingTimer и дедупликацию в очереди для более эффективного управления событиями.
В современном мире важно эффективно управлять большими объемами данных и сложными рабочими процессами. Temporal.io предлагает мощное решение для создания масштабируемых и надежных рабочих процессов. Рассмотрим, как использовать Temporal для управления жизненным циклом документов, обрабатывая изменения документов без перегрузки системы.
Проблема
Представьте, что нужно отслеживать изменения файлов или документов. Эти документы обычно неактивны и не потребляют много ресурсов, пока пользователь не внесет изменения или не загрузит новый файл. В этот момент начинается активная работа системы. Некоторые процессы (например, создание сводок с помощью ИИ) не могут выполняться одновременно с активностью пользователя и должны накапливать изменения или ждать завершения работы.
Решение
Temporal позволяет создавать таймеры и обработчики событий, что помогает управлять сложными состояниями и наблюдать за событиями. Это обеспечивает чистую и последовательную обработку изменений документов без лишней нагрузки на ресурсы.
Шаги реализации:
📋 Предпосылки: Определите основные классы для событий и очередей событий.
🛠️ Создание базового рабочего процесса: Создайте Workflow с методами для сигналов и запуска.
📤 Отправка событий в Workflow: Реализуйте метод для отправки событий в Workflow.
⏱️ Введение таймеров: Добавьте таймеры для более эффективного управления поведением пользователей.
🔄 Продолжение как новый: Реализуйте механизм перезапуска Workflow при достижении лимита истории.
🚀 Продвинутые таймеры и дедупликация: Реализуйте RollingTimer и дедупликацию в очереди для более эффективного управления событиями.
👍3🔥1
Конкурс года в «Библиотеке программиста»: смонтируйте короткий вертикальный ролик формата Shorts/Reels* на тему программирования и разработки — лучший автор получит 40 тысяч рублей
Подробные условия:
Какие ролики мы не принимаем:
Таймлайн:
2 августа — заканчиваем принимать видео
⬇️
3 августа — начинаем загружать лучшие видео в инстаграм
⬇️
9 августа — подводим итоги
*Организация Meta признана экстремистской в РФ
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4👍1🔥1🎉1
🆕 JavaScript эволюционирует: новые методы и функции для эффективной разработки
Нововведения нацелены на повышение читаемости и эффективности кода. Рассмотрим, как Object.groupBy, регулярные выражения с V-флагом, Promise.withResolvers и методы мутации массивов решают актуальные задачи программирования.
🔗 Читать статью
🔗 Зеркало
Нововведения нацелены на повышение читаемости и эффективности кода. Рассмотрим, как Object.groupBy, регулярные выражения с V-флагом, Promise.withResolvers и методы мутации массивов решают актуальные задачи программирования.
🔗 Читать статью
🔗 Зеркало
🥱2
#дайджест новостей по PHP за неделю:
🔎Версионирование API в Laravel 11 — С выходом Laravel 11 скелет приложения был урезан, чтобы удалить лишние файлы, которые не нужны в каждом проекте. Частью этого изменения стало удаление из исходного кода приложения всех поставщиков услуг, кроме AppServiceProvider.
🔎Built with Laravel — BuiltWithLaravel.com — список компаний и организаций, использующих Laravel в мире, не связанном с Laravel.
🔎PHP 8.4.0 Alpha 2 доступен для тестирования — Команда PHP рада объявить о выходе второго тестового релиза PHP 8.4.0, Alpha 2. Это продолжение цикла выпуска PHP 8.4, примерный план которого указан в PHP Wiki.
🔎Неделя Symfony #916 (15-21 июля 2024 года) — На этой неделе активность разработчиков была медленнее, чем обычно, и была сосредоточена на исправлениях и доработках во всех поддерживаемых ветках.
🔎Версионирование API в Laravel 11 — С выходом Laravel 11 скелет приложения был урезан, чтобы удалить лишние файлы, которые не нужны в каждом проекте. Частью этого изменения стало удаление из исходного кода приложения всех поставщиков услуг, кроме AppServiceProvider.
🔎Built with Laravel — BuiltWithLaravel.com — список компаний и организаций, использующих Laravel в мире, не связанном с Laravel.
🔎PHP 8.4.0 Alpha 2 доступен для тестирования — Команда PHP рада объявить о выходе второго тестового релиза PHP 8.4.0, Alpha 2. Это продолжение цикла выпуска PHP 8.4, примерный план которого указан в PHP Wiki.
🔎Неделя Symfony #916 (15-21 июля 2024 года) — На этой неделе активность разработчиков была медленнее, чем обычно, и была сосредоточена на исправлениях и доработках во всех поддерживаемых ветках.
❤3👍1
Алгоритмы в PHP: Deque (и круговые буферы + связанные списки)
PHP массивы хорошо подходят для многих задач, но операции добавления элементов в начало массива (array_unshift) являются медленными, поскольку требуют сдвига всего массива. Решение для этого проблемы — использование deque (двусторонней очереди).
Очереди и стеки
В программировании, очереди и стеки играют важную роль:
Очередь (FIFO): первый пришел — первый ушел. Работает как очередь в магазине.
Стек (LIFO): последний пришел — первый ушел. Работает как стопка тарелок.
Двусторонняя очередь (Deque)
Deque позволяет добавлять и удалять элементы с обоих концов с эффективностью O(1). Обычно реализуется на основе связанных списков или кольцевого буфера и идеально подходит для реализации функций отмены (undo).
Реализация кольцевого буфера
Для улучшения производительности можно использовать кольцевой буфер, что минимизирует затраты на операции добавления и удаления элементов. Кольцевой буфер использует два курсора (head и tail), что позволяет добавлять и удалять элементы с обоих концов массива.
Добавление элемента в начало буфера
🔸Проверить, заполнен ли буфер.
🔸Если курсор уже в начальной позиции, переместить его в конец массива.
🔸Иначе, декрементировать курсор.
🔸Добавить элемент в массив.
Добавление элемента в конец буфера
🔸Проверить, заполнен ли буфер.
🔸Если курсор уже в конце массива, переместить его в начало.
🔸Иначе, инкрементировать курсор.
🔸Добавить элемент в массив.
PHP массивы хорошо подходят для многих задач, но операции добавления элементов в начало массива (array_unshift) являются медленными, поскольку требуют сдвига всего массива. Решение для этого проблемы — использование deque (двусторонней очереди).
Очереди и стеки
В программировании, очереди и стеки играют важную роль:
Очередь (FIFO): первый пришел — первый ушел. Работает как очередь в магазине.
Стек (LIFO): последний пришел — первый ушел. Работает как стопка тарелок.
Двусторонняя очередь (Deque)
Deque позволяет добавлять и удалять элементы с обоих концов с эффективностью O(1). Обычно реализуется на основе связанных списков или кольцевого буфера и идеально подходит для реализации функций отмены (undo).
Реализация кольцевого буфера
Для улучшения производительности можно использовать кольцевой буфер, что минимизирует затраты на операции добавления и удаления элементов. Кольцевой буфер использует два курсора (head и tail), что позволяет добавлять и удалять элементы с обоих концов массива.
Добавление элемента в начало буфера
🔸Проверить, заполнен ли буфер.
🔸Если курсор уже в начальной позиции, переместить его в конец массива.
🔸Иначе, декрементировать курсор.
🔸Добавить элемент в массив.
Добавление элемента в конец буфера
🔸Проверить, заполнен ли буфер.
🔸Если курсор уже в конце массива, переместить его в начало.
🔸Иначе, инкрементировать курсор.
🔸Добавить элемент в массив.
👍5❤1🔥1🥰1👏1
✍️ «Библиотека программиста» находится в поиске автора на написание книжных рецензий
Кто нужен?
● Энтузиасты (джуны и выше), которые которые разбираются в IT
● Любители книг, которые хотели бы получать деньги за чтение и написание рецензий
● Работаем с самозанятыми (компенсируем налог), ИП
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
✉️ Станьте частью нашей команды — присылайте резюме и примеры работ [email protected]
Кто нужен?
● Энтузиасты (джуны и выше), которые которые разбираются в IT
● Любители книг, которые хотели бы получать деньги за чтение и написание рецензий
● Работаем с самозанятыми (компенсируем налог), ИП
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
✉️ Станьте частью нашей команды — присылайте резюме и примеры работ [email protected]
👍2
Forwarded from Proglib.academy | IT-курсы
В 2024 году IT-специалисты остаются на пике популярности. Но стоит ли вам становиться одним из них? Рассмотрим основные аргументы, чтобы понять, стоит ли вам становиться IT-специалистом в нашей статье.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1
Golang убивает PHP
В последние годы на рынке наблюдается тенденция к замене PHP на Golang, и многие компании рассматривают возможность переписывания своих проектов с PHP на Golang. Такой подход имеет свои основания, однако каждый язык программирования предназначен для решения определенных задач, и производительность во многом зависит от разработчика, а не от самого языка программирования.
В связи с этим планируется публикация ряда статей, которые будут посвящены особенностям разработки, проблемам, которые необходимо учитывать, а также ролям участников разработки, таким как DevOps-инженеры.
В последние годы на рынке наблюдается тенденция к замене PHP на Golang, и многие компании рассматривают возможность переписывания своих проектов с PHP на Golang. Такой подход имеет свои основания, однако каждый язык программирования предназначен для решения определенных задач, и производительность во многом зависит от разработчика, а не от самого языка программирования.
В связи с этим планируется публикация ряда статей, которые будут посвящены особенностям разработки, проблемам, которые необходимо учитывать, а также ролям участников разработки, таким как DevOps-инженеры.
Хабр
Golang убивает PHP
Последние несколько лет на рынке, по моему сугубо личному мнению, golang вытесняет PHP с рынка, а многие компании считают, что проекты, которые сейчас написаны и работают на PHP должны быть переписаны...
🥱32👍6😁3🔥2👾1
Гайд по Query Scopes в Laravel
В Laravel имеются локальные и глобальные запросные области (query scopes), которые позволяют определять ограничения в запросах Eloquent, делая их повторно используемыми и более читаемыми.
Локальные области запросов необходимо применять вручную, а глобальные области запросов автоматически применяются ко всем запросам модели.
В Laravel имеются локальные и глобальные запросные области (query scopes), которые позволяют определять ограничения в запросах Eloquent, делая их повторно используемыми и более читаемыми.
Локальные области запросов необходимо применять вручную, а глобальные области запросов автоматически применяются ко всем запросам модели.
Laravel News
Learn to master Query Scopes in Laravel - Laravel News
In this article, we're going to take a look at local query scopes and global query scopes
❤4👍1