Эта ошибка возникает в двух вариантах:
$arr = [1, 2, 3];
Синтаксис инициализатора этого массива был введен только в PHP 5.4; это приведет к возникновению ошибки парсера в версиях до этого. Если возможно, обновите свою установку или используйте старый синтаксис:
$arr = array(1, 2, 3);
См. Также этот пример из руководства.
$suffix = explode(',', 'foo,bar')[1];
Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам нужно использовать временную переменную:
$parts = explode(',', 'foo,bar');
$suffix = $parts[1];
См. Также этот пример из руководства.
Здесь является большими семью:
Полезный только среди процессов, связанных как родитель/ребенок. Звоните pipe(2)
и fork(2)
. Однонаправленный.
FIFO или именованный канал
Два несвязанных процесса могут использовать FIFO в отличие от простого канала. Звоните mkfifo(3)
. Однонаправленный.
Двунаправленный. Предназначенный для сетевой связи, но может использоваться локально также. Может использоваться для различного протокола. Нет никакой границы сообщения для TCP. Звоните socket(2)
.
ОС поддерживает дискретное сообщение. См. sys/msg.h.
отправляет целое число в другой процесс. Не сцепляется хорошо с мультипотоками. Звоните kill(2)
.
механизм синхронизации А для много процессов или потоков, подобных очереди людей, ожидающих ванной. См. sys/sem.h.
Делают Ваше собственное управление совместным выполнением. Звоните shmget(2)
.
Одним определяющим фактором при выборе одного метода по другому является граничная проблема сообщения. Можно ожидать, что "сообщения" будут дискретны друг от друга, но это не для потоков байтов как TCP или Канал.
Рассматривают пару клиента и сервера эха. Клиент отправляет строку, сервер получает ее и отправляет ее назад. Предположим, что клиент отправляет "Привет", "Привет", и "Как насчет ответа?".
С протоколами потока байтов, сервер может получить как "Ад", "oHelloHow", и "об ответе?"; или более реалистично "HelloHelloHow об ответе?". Сервер не имеет никакой подсказки, где граница сообщения.
возраст старый прием должен ограничить длину сообщения до CHAR_MAX
или UINT_MAX
и согласиться отправить длину сообщения сначала в char
или uint
. Так, если Вы в стороне получения, необходимо считать длину сообщения сначала. Это также подразумевает, что только один поток должен делать сообщение, читающее за один раз.
С дискретными протоколами как UDP или очереди сообщений, Вы не должны волноваться об этой проблеме, но программно потоки байтов легче иметь дело с тем, потому что они ведут себя как файлы и stdin/out.
Общая память может быть самой эффективной, так как Вы создаете свою собственную коммуникационную схему сверху ее, но требуется большой уход и синхронизация. Решения доступны для распределения общей памяти к другим машинам также.
Сокеты являются самыми портативными в эти дни, но требуют больше служебного, чем каналы. Способность прозрачно использовать сокеты локально или по сети является большой премией.
Очереди сообщений и сигналы могут быть большими для приложений жесткого реального времени, но они не так гибки.
Эти методы были естественно созданы для коммуникации между процессами, и использующий несколько потоков в рамках процесса может усложнить вещи - особенно с сигналами.
Стоит отметить, что много библиотек реализует один тип вещи сверху другого.
Общая память не должна использовать ужасные sysv функции общей памяти - это намного более изящно для использования mmap () (mmap файл в на tmpfs/dev/shm, если Вы хотите названный; mmap/dev/zero, если Вы хотите разветвленный не exec'd процессы наследовать его анонимно). Однако это все еще оставляет Ваши процессы с некоторой потребностью в синхронизации для предотвращения проблем - обычно при помощи некоторых из других механизмов IPC, чтобы сделать синхронизацию доступа к области общей памяти.
Вот веб-страница с простым тестом: https://sites.google.com/site/rikkus/sysv-ipc-vs-unix-pipes-vs-unix- сокеты
Насколько я могу судить, каждый из них имеет свои преимущества: