在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/PHP  網(wǎng)絡(luò)安全/ php 的 rename 函數(shù)在什么情況下會(huì)輸出 Operation not p

php 的 rename 函數(shù)在什么情況下會(huì)輸出 Operation not permitted 的錯(cuò)誤,而不是警告?

基本環(huán)境
Ubuntu 16.04.1
apache 2.4
php 7.1.7

php 文件的根目錄是通過(guò) samba 掛載的一個(gè) windows 機(jī)器下的目錄

//192.168.44.1/dev/144 on /home/wwwroot type cifs (rw,nosuid,nodev,noexec,relatime,vers=default,cache=none,domain=,uid=0,forceuid,gid=0,forcegid,addr=192.168.44.1,file_mode=0777,dir_mode=0777,nounix,mapposix,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1)

目錄本身是可以訪問(wèn)的……擁有所有rw權(quán)限,只是沒(méi)有 x 權(quán)限

報(bào)錯(cuò)部分……

84:        if(file_exists($targetPath))return true;
85:        if (!$tran) return rename($fromPath, $targetPath);【此行】
[2018-03-26 09:44:45] local.ERROR: ErrorException: rename(/tmp/php2aXCEp,/home/wwwroot/cm/public_static/upload/user/1b/11384324d7be4098700a14ecfb418a.png): Operation not permitted in /home/wwwroot/cm/app/Helpers/FileReceiver.php:85

http://php.net/manual/en/func...

根據(jù)文檔來(lái)講的話,在版本 4.3.3 之后 rename 到不支持的文件系統(tǒng)上“可能”會(huì)產(chǎn)生一個(gè)警告……
但是現(xiàn)在的情況是這個(gè)函數(shù)直接就拋出了一個(gè)錯(cuò)誤,但是文件卻又復(fù)制成功了……
官方這文檔下面也有幾個(gè)遇到同樣情況的仁兄【就是都被踩墊底了……】,雖然加個(gè) @ 再重新 file_exists 基本就可以解決問(wèn)題,不過(guò)這種情況是如何產(chǎn)生的?

回答
編輯回答
墨小白

許久沒(méi)有管這個(gè)事情……自問(wèn)自答了……
翻了一下評(píng)論曰實(shí)際上是一個(gè)fat文件系統(tǒng)權(quán)限的問(wèn)題……說(shuō)是說(shuō)不能叫做bug……但是總之就當(dāng)個(gè)注意點(diǎn)吧……
參考ben at indietorrent dot org 的回答……
也就是復(fù)制到fat格式的文件系統(tǒng)上時(shí)會(huì)產(chǎn)生如此的錯(cuò)誤……

From the Changelog notes:

"Warnings may be generated if the destination filesystem doesn't permit chown() or chmod() system calls to be made on files — for example, if the destination filesystem is a FAT filesystem."

More explicitly, rename() may still return (bool) true, despite the warnings that result from the underlying calls to chown() or chmod(). This behavior can be misleading absent a deeper understanding of the underlying mechanics. To rename across filesystems, PHP "fakes it" by calling copy(), unlink(), chown(), and chmod() (not necessarily in that order). See PHP bug #50676 for more information.

On UNIX-like operating systems, filesystems may be mounted with an explicit uid and/or gid (for example, with mount options "uid=someuser,gid=somegroup"). Attempting to call rename() with such a destination filesystem will cause an "Operation not permitted" warning, even though the file is indeed renamed and rename() returns (bool) true.

This is not a bug. Either handle the warning as is appropriate to your use-case, or call copy() and then unlink(), which will avoid the doomed calls to chown() and chmod(), thereby eliminating the warning.
2017年10月21日 05:58