TORU Foorum

php valetab failisuuruste kohta

salu - 19.11.2010 14:20

Jama siis selline, et php-põhine faililisti skript ajab üle 2Gb suuruste failide kohta imelikku plära, nt:

arx1290168195r.jpg - 7kB

Tolle faili tegelik suurus on 3,9Gb. Nt. 4,4Gb faili kohta väidab suuruseks 373Mb, 8Gb aga -67189.1 KB. Alla 2Gb failide puhul probleeme netu. Olen testinud mitut erinevat skripti, kõik ajavad ühesugust jura.

Oskab keegi miskit tarka kosta, kuidas asi lahendada? Tegu on dedi-servuga, seega täielik ruut olemas, juhuks kui tuleb hoopis servu konfi kallale minema (php.ini?).

Tänud ette.

DonQ - 19.11.2010 14:37

Ja millise funktsiooniga skript faili suurust küsib?

salu - 19.11.2010 15:21

Erinevad skriptid erinevalt, hetkel pusin sellega:

http://subclub.ee/salu/index.php.txt

DonQ - 19.11.2010 15:25

Kuskilt maailmast:
Note: Because PHP's integer type is signed and many platforms use 32bit integers, filesize() may return unexpected results for files which are larger than 2GB. For files between 2GB and 4GB in size this can usually be overcome by using sprintf("%u", filesize($file)).


Ja ära püüagi rahvale seletada, et sa ei saa aru, misasi on funktsioon ja misasi on skript :)

[Muudetud: 19.11.2010 DonQ]

salu - 19.11.2010 15:29

Krt, mu engliis on üsna nigel, äkki ikkagi ütled, mida ma seal skripti lõpus pean ära muutma :)

DonQ - 19.11.2010 16:20

Tead, ei ütle (ma ise pole php-d progenud ka). Lisaks töötab minu kommenteeritud lahendus vaid kuni 4GB-ni, edasi jälle jama.

PHP lehel on pikem diskussioon ja koodijupid suuremate failide suuruse kohta. Inglise keele mitteoskamine ei vabanda - ka mina pole inglise keelt õppinud, aga elu sunnib sellest aru saama.
http://php.net/manual/en/function.filesize.php

Üldiselt pead tegema enda funktsiooni faili suuruse näitamise kohta ja selle funktsiooni kirjutama skripti praeguse funktsiooni asemele. Kuna sinu poolt näidatud skriptis on see funktsioon juba olemas (function letter_size($byte_size)), siis pead vaid selle sisu niimoodi ümber tegema, et ta ka suuremaid faile oskab õigesti näidata.

Võib-olla leiad kuskilt selle koodijupi uuema versiooni - ei usu, et keegi seda aja jooksul kohendanud pole.

salu - 19.11.2010 16:54

Mnjah, näib, et viga on ikka kuskil mujal. Proovisin mitut skripti teises serveris ja polnud probleeme, failide suurused olid kenasti paigas.
Vot nüüd olen küll plindris :(

DonQ - 19.11.2010 18:33

No kui sa viitsiksid inglise keele läbi närida, siis viimati viidatud teemas oli juttu sellest, et erinevatel serveritel (windows IIS, windows apache, linuxi erinevad kernelid, 32 bitti, 64 bitti, erinevad failisüsteemid) ja erinevate php versioonidega tuleb kasutada erinevat töötlust, et õige number kätte saada. Mõnel puhul tehti isegi nii, et lasti failisüsteemi dir (või ls) käsk käima ja tulemusest lõigati see jupp teksti välja, kus faili pikkus kirjas - kuna 32bitise numbri teoreetiliselt kõige suurem väärtus üle 4GB ei lähe, siis php tasemel on raske selliste numbritega midagi mõistlikku teha.

Mõni teadja võiks ju ka sõna võtta (ja sina võiksid serveri konfist natuke pajatada :))

salu - 19.11.2010 18:49

Server on Apache/2.2.16 (Debian) PHP/5.3.2-2 with Suhosin-Patch (Kerneli versioon 2.6.26-2-686 (SMP) i686).

Aga mõningase pusimisega sai asi lõpuks ikkagi jonksu. Ikke jah tuli skripti veidi krõhvitseda.

DonQ - 19.11.2010 19:25

A viitsid sa siis neid võrdlemiseks näidata? Ma lihtsalt uudishimust, et mis imeasju see php nõuab :)

salu - 19.11.2010 19:33

Nu see sama skript, mis ma enne andsin, sinna sai lisatud funktsioon:


Kood:
function getSize($file) { $size = exec ('stat -c %s '. escapeshellarg ($file)); return $size; }


Ja real 482 sai tehtud lihtne muudatus:


Kood:
enne: $file_size = filesize($content_path); pärast: $file_size = getSize($content_path);


Tulemus:

klz1290186453f.jpg - 4kB