2010-11-15 69 views
1

我分享一些存储区域C++和PHP无法访问PHP/C++共享内存在网上

在PHP结束时,我有:

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

哪里SHID是我ftok创建的标识符。

这一切工作正常,当我运行这个PHP脚本登录的服务器上的根,但是当我试图通过网络远程运行它,我得到:

警告:shmop_open()[function.shmop开]:无法在第6行的/var/www/html/prof/phpsm.php中附加或创建共享内存段

...其中第6行是我上面显示的行。

由于它运行良好,当我作为根从服务器运行它时,我假设某处阻止了Web用户请求连接到共享内存。

有谁知道可能是什么原因造成的?

感谢

+0

平台是...? – 2010-11-15 17:05:31

+0

这是Linux的红帽。 – Columbo 2010-11-15 17:08:24

回答

1

问题是SELinux禁止的SHM访问(您可以通过运行setenforce 0,测试和运行后setenforce 1验证),但我不知道解决它比修改其他的好办法该策略或切换到mmap。

+0

谢谢。 setenforce 0给了我'setenforce()失败的回应',但我会再看看它现在你给了我一些继续。 – Columbo 2010-11-15 17:48:21

+0

它正在运行,如果我做sestatus它告诉我SELinux已启用,但尽管有root访问权限(通过SSH)它不会让我执行任何更改。我试过'newrole -r sysadmn_r'来查看是否有帮助,但我只是得到:'newrole command not found'。 – Columbo 2010-11-15 18:05:35

+0

你说得对,这是SELinux,谢谢。 – Columbo 2010-11-18 09:30:22

0

只需添加到接受的答案,我需要保持的SELinux的强制模式,所以最后我做以下,以允许访问共享内存的操作在PHP中:在许可模式

  1. 放了SELinux
  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;