PHP is_readable () завершается ошибкой в читаемой директории samba

Вызовы функции is_readable () в PHP возвращают значение false для каталога, который доступен для чтения из командной строки. Я поменял разрешения на максимально допустимые и до сих пор не повезло.

ls -lad /remote/samba_share
drwxrwxr-x 13 me users 0 May 29 15:49 /remote/samba_share

ls -la /remote/samba_share
drwxr-xr-x  4 me users 0 May  8 14:19 /remote/samba_share/local_dir
drwxr-xr-x 16 me users 0 May 14 19:49 /remote/samba_share/second_drive
drwxrwxrwx 12 me users 0 May 30 09:42 /remote/samba_share/ext_raid

Запуск следующего кода ...

if (is_readable('/remote/samba_share'              )){ echo "share ok\n";  } else { echo "share BAD\n";  }
if (is_readable('/remote/samba_share/local_dir'    )){ echo "local ok\n";  } else { echo "local BAD\n";  }
if (is_readable('/remote/samba_share/second_drive' )){ echo "second ok\n"; } else { echo "second BAD\n"; }
if (is_readable('/remote/samba_share/ext_raid'     )){ echo "raid ok\n";   } else { echo "raid BAD\n";   }

... результаты в ...

share ok
local ok
second BAD
raid BAD

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

Подробности конфигурации машины, где вызывается is_readable ():

php -v
PHP 5.3.11-pl0-gentoo (cli) (built: May  5 2012 16:48:35)

php.ini:
    safe_mode = Off
    safe_mode_gid = On # (tried either way, shouldn't matter)
    ;open_basedir =

/etc/fstab entry:
    //remote_machine/samba_share /remote/samba_share cifs iocharset=utf8,credentials=/blahblah/samba_credentials,uid=me,gid=users,file_mode=0777,dir_mode=0777,auto   0 0

eix samba
[I] net-fs/samba
     Installed versions:  3.5.15!t

Детали конфигурации удаленного компьютера:

eix samba
[I] net-fs/samba
     Installed versions:  3.5.15!t

/etc/samba/smb.conf:

    [samba_share]
       path = /samba_share/
       public = yes
       writable = yes
    ;  printable = yes
       browseable = yes
       create mask = 0777
       create mode = 0777
       directory mode = 0777

Я перепробовал все, что мог придумать, чтобы заставить это работать, и теперь я чувствую себя глупым. :-) Я могу также предоставить конфигурацию ядра, если это кому-то кажется актуальным. СПАСИБО за любую помощь!

 moodboom30 мая 2012 г., 20:57
Если кто-то еще сможет проверить мои выводы здесь, я приму их ответ и отправлю отчет об ошибке PHP. Спасибо!
 moodboom30 мая 2012 г., 17:31
Марк Б, я обновил вопрос, чтобы прояснить это лучше.
 moodboom30 мая 2012 г., 19:17
У меня есть обходной путь для этого на данный момент. Я могу настроить общий ресурс samba на удаленном компьютере, который напрямую использует точку монтирования ext_raid, а is_readable () возвращает true. На данный момент это похоже на ошибку PHP. is_readable (), по-видимому, не допускает пересечения разделов внутри общего пути samba.
 moodboom30 мая 2012 г., 17:00
Нет, это второй диск, смонтированный на удаленном компьютере, который находится в общей папке samba. По какой-то причине каждый каталог, физически расположенный в первичном разделе на этой машине, работает, но другие расположения, смонтированные в других разделах, не работают.
 Marc B30 мая 2012 г., 16:56
'second_share', как на самом деле это какой-то ДРУГОЙ установленный общий ресурс самбы, расположенный под основным общим ресурсом самбы?

Ответы на вопрос(2)

Решение Вопроса

PHP ошибка билета  чтобы отследить проблему лучше. Спасибо за весь вклад!

is_readable() просто оборачиваетдоступ системный вызов для определения прав доступа к файлу, так что, скорее всего, это не проблема php.

В соответствии с конфигурацией samba и правами доступа к файлам наиболее вероятной причиной может быть SELINUX. PHP, вероятно, работает как другой пользователь (независимо от того, является ли CLI более влажным модом Apache), так что это может быть selinux запрещает доступ этому пользователю.

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

 moodboom31 мая 2012 г., 16:06
Доступ, кажется, работает нормально. код:cout << "access R_OK share: " << access("/remote/samba_share", R_OK) << endl; cout << "access R_OK local: " << access("/remote/samba_share/local_dir", R_OK) << endl; cout << "access R_OK second: " << access("/remote/samba_share/second_drive", R_OK) << endl; cout << "access R_OK raid: " << access("/remote/samba_share/ext_raid", R_OK) << endl;' result: Доступ R_OK Поделиться: 0`access R_OK local: 0 access R_OK second: 0 access R_OK raid: 0    Я думаю, мне нужно покопаться в коде Zend Engine для вызова access () ...?
 31 мая 2012 г., 16:16
@sebastian: весьма маловероятно, что php будет работать от имени другого пользователя в режиме CLI - для изменения идентификаторов пользователей требуются права доступа root.
 31 мая 2012 г., 17:52
@moodboom: я действительно не ожидал этого. только что посмотрел код (github.com/php/php-src/blob/master/ext/standard/filestat.c) и в php_stat () ничего особенного не происходит, кроме вызова доступа. Мне сейчас любопытно, думаю, что билет с ошибкой будет хорошим выбором сейчас.
 moodboom31 мая 2012 г., 18:00
@ SebastianKe & # xDF; ler Я надеялся, что кто-то еще сможет проверить, что я вижу первым. Есть так много потенциальных переменных. Но я думаю, что жучок - это место, где можно их исследовать, а не здесь. Спасибо!
 moodboom31 мая 2012 г., 15:25
Спасибо Себастьян. У меня нет SELINUX включен. Я запускаю тест PHP из командной строки, как & quot; me & quot; пользователь в этом примере, так что это не другой пользователь в этом случае. Я напишу немного кода на C и посмотрю, что мне дает access () ...

Ваш ответ на вопрос