PHP un post_max_size
17. April, 2007, 17:47 PamācībasSaskāros ar problēmu, kad nosūtot serverim POST datus ar datiem, kuru kopizmērs pārsniedz PHP konfigurācijā norādīto post_max_size, tad galu galā PHP pusē $_POST (un $_FILES masīvs arī, ja tiek sūtīti arī faili) ir tukšs. Nekāds kļūdas paziņojums nekur neparādās; vispār nenotiek nekas. PHP pusē tas viss izskatās, ka vienkārši ir veikts tukšs POST pieprasījums.
Problēmas sākas tad, ja domājam par lapas lietotājam un gribam viņus informēt, par to, ka dati nav nosūtīti, jo pārsniegts kopējais atļautais izmērs.
Nedaudz padomājot, radās viens variants:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST) == 0) {
// Pieņemam, ka POST ir pārsniedzis atļauto izmēru.
}
?>
Bet #php.lv kanālā KAC norādīja uz komentāru PHP manuālī, tāpēc iepriekšējo piemēru papildināju vēl ar $_SERVER[’CONTENT_LENGTH’] pārbaudi.
Pārskatāmākā un rejūzojamākā (manuprāt) veidolā tas izskatās šādi:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST) == 0
&& $_SERVER['CONTENT_LENGTH'] > get_post_max_size()) {
// Tagad pavisam droši zinām, ka POST ir pārsniedzis atļauto izmēru.
}
function get_post_max_size() {
$ini_value = trim(ini_get('post_max_size'));
$unit = strtolower($ini_value{strlen($ini_value)-1});
$value = (int) $ini_value;
switch($unit) {
case 'g':
$value *= 1024 * 1024 * 1024;
break;
case 'm':
$value *= 1024 * 1024;
break;
case 'k':
$value *= 1024;
break;
}
return ($value > 0) ? $value : false;
}
?>


17. April, 2007, 21:35
switch($unit) {
case ‘g’:
$value *= 1024 * 1024 * 1024;
break;
case ‘m’:
$value *= 1024 * 1024;
break;
case ‘k’:
$value *= 1024;
break;
}
var aizstāt ar
switch($unit) {
case ‘g’:
$value *= 1024;
case ‘m’:
$value *= 1024;
case ‘k’:
$value *= 1024;
}
imho īsāk.
18. April, 2007, 10:37
Ir īsāk, bet arī galvu jaucošāk. Man labāk tomēr patīk izmantot break;