Невозможно получить доступ к общей памяти PHP / C ++ через Интернет - PullRequest
1 голос
/ 15 ноября 2010

Я делю память между C ++ и PHP

В конце PHP у меня есть:

   $inputshm_id = shmop_open($shid, "w", 0777, 1024);

Где shid - это идентификатор, который я создал с помощью ftok.

Это все работает нормально, когда я запускаю этот скрипт PHP, вошедший в систему как root на сервере, но когда я пытаюсь запустить его удаленно через Интернет, я получаю:

Предупреждение: shmop_open () [function.shmop-open]: невозможно присоединить или создать сегмент общей памяти в /var/www/html/prof/phpsm.php в строке 6

... где строка 6 - это строка, которую я показал выше.

Поскольку все работает нормально, когда я запускаю его с сервера от имени пользователя root, я предполагаю, что что-то где-то препятствует подключению запросов веб-пользователей к общей памяти.

Кто-нибудь знает, что может быть причиной этого?

Спасибо

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Проблема заключается в том, что SELinux блокирует доступ к shm (вы можете проверить, запустив setenforce 0, протестировав и запустив setenforce 1 после), но я не знаю хорошего способа ее решения, кроме изменения политикиили переход на mmap.

0 голосов
/ 22 октября 2014

Просто чтобы добавить к принятому ответу, мне нужно было держать SELinux в принудительном режиме, поэтому я в итоге сделал следующее, чтобы разрешить доступ к операциям с общей памятью в PHP:

  1. перевел selinux в разрешающий режимmode
  2. переводит selinux в режим "не блокировать": semodule -DB (это было важно, поскольку операции shmop по умолчанию не регистрировались)
  3. очищено/var/log/audit/audit.log
  4. выполнил испорченный скрипт с операциями с общей памятью
  5. сгенерировал модуль selinux: audit2allow -a -M audit.log
  6. установленный модуль: semodule -i audit.log.pp

Я закончил через несколько итераций этого, чтобы все было правильно, но мой финалполитика на CentOS 6 была:

module audit.log 1.0;
require {
        type unconfined_t;
        type httpd_t;
        type audisp_t;
        type auditd_t;
        type user_tmpfs_t;
        class process { siginh noatsecure rlimitinh };
        class shm { associate unix_read getattr read };
        class file { read };
}
allow auditd_t audisp_t:process { siginh rlimitinh noatsecure };
allow httpd_t unconfined_t:shm { associate unix_read getattr read };
allow httpd_t user_tmpfs_t:file read;
...