วิธีเพิ่มระยะหมดเวลาการดำเนินการใน php?


103

วิธีเพิ่มระยะหมดเวลาการทำธุรกรรม ฉันต้องการอัปโหลดวิดีโอ แต่ไม่ได้อัปโหลดวิดีโอขนาดใหญ่?

มันแสดงข้อผิดพลาด The process *** exceeded the timeout of 60 seconds.


1
กำหนด "การหมดเวลาของธุรกรรม" อะไรไม่ทำงานที่ไหน
Pekka

1
ทำไมคุณถึงคิดว่าหมดเวลา "ธุรกรรม"
สามัญสำนึกของคุณ

อัปโหลดวิดีโอสั้น ๆ เรียบร้อยแล้ว แต่ไม่ได้อัปโหลดวิดีโอขนาดยาวฉันคิดว่าหมดเวลา
Aamir

ini_set ('post_max_size', '200M'); ini_set ('upload_max_filesize', '200M'); ini_set ('max_execution_time', '200M'); ini_set ('max_input_time', '200M'); ini_set ('memory_limit', '200M'); set_time_limit (65536);
Aamir

1
จะดีกว่าถ้าแยกไฟล์ก่อนอัปโหลด มีแอพมากมายที่สามารถใช้งานได้ ฉันเตรียม plupload
bksi

คำตอบ:


130

คุณต้องเปลี่ยนการตั้งค่าบางอย่างใน php.ini ของคุณ:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds

PHP.ini ของคุณตั้งอยู่ขึ้นอยู่กับสภาพแวดล้อมของคุณหรือไม่ข้อมูลเพิ่มเติม: http://php.net/manual/en/ini.list.php


ขอโทษฉันไม่รู้ว่าคุณหมายถึงอะไร :(
Hannes

@Aamir คุณต้องได้รับอนุญาตจากเว็บโฮสต์ของคุณเพื่อเปลี่ยนแปลงการกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณ บ่อยครั้งที่พวกเขาไม่ยอมให้คุณเปลี่ยนอะไรแบบนั้น
hellozimi

ฉันสามารถเปลี่ยน upload_max_filesize และ max_execution_time ในไฟล์ htaccess ได้หรือไม่
Aamir

2
@Col ฉันไม่เห็นด้วยเขาต้องการที่จะทำการเปลี่ยนแปลงทันทีและไม่ใช่แอปพลิเคชันทั้งหมดดังนั้นเขาจึงถามว่าเขาจะทำเช่นนั้นได้อย่างไร และแม้ว่าเขาจะถามว่าเขาสามารถเปลี่ยนบางสิ่งใน php.ini ได้อย่างไรมันอาจเป็นคำถามสำหรับมือใหม่ แต่เป็นคำถามที่ถูกต้องเหมือนกัน
Hannes

1
@IulianOnofrei เอาล่ะแค่รู้สึกว่าต้องชี้ให้เห็น: D แต่บางทีถ้าคุณไม่รู้ว่ามันคืออะไรก็ยังดีที่จะมองขึ้น ... "คนที่ไม่สามารถเรียนรู้จากประวัติศาสตร์ได้จะต้องทำซ้ำ" และทั้งหมดนั้น …
Hannes

57

คุณควรจะสามารถทำได้ในระหว่างรันไทม์โดยใช้ไฟล์

set_time_limit(100);

http://php.net/manual/en/function.set-time-limit.php

หรือใน vhost-config ของคุณ

php_admin_value max_execution_time 10000

การมีขีด จำกัด เวลาดำเนินการทั่วโลกที่ LOW ส่วนใหญ่เป็นความคิดที่ดีสำหรับเหตุผลด้านประสิทธิภาพของแอปพลิเคชันที่ไม่น่าเชื่อถือ ดังนั้นคุณอาจต้องการอนุญาตให้สคริปต์เหล่านั้นทำงานได้นานขึ้นเท่านั้น

ps: อย่าลืม post_max_size และ upload_max_filesize (เหมือนคำตอบแรกที่บอก allready)


หากคุณตั้งค่าการนอนหลับจะถูกละเว้น
Snake Eyes

21

เพื่อให้คำตอบของ Hannes สมบูรณ์

คุณต้องเปลี่ยนการตั้งค่าบางอย่างใน php.ini ของคุณ:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must

หากมีคนต้องการใส่ไม่ จำกัด (ฉันไม่รู้ว่าทำไม แต่ถ้าคุณต้องการ) คุณสามารถตั้งเวลาเป็น 0:

คุณต้องเปลี่ยนการตั้งค่าบางอย่างใน php.ini ของคุณ:

upload_max_filesize = 0 

max_execution_time = 0

และถ้าคุณไม่รู้ว่า php.ini อยู่ที่ไหน คุณสามารถสร้างไฟล์ "name.php" ในเซิร์ฟเวอร์ของคุณและใส่:

<?php phpinfo(); ?>

และบนเว็บไซต์ของคุณคุณสามารถดูการกำหนดค่า php.ini ของคุณและมีการระบุว่าอยู่ที่ไหน

แก้ไขเมื่อ 9 มกราคม 2558:

หากคุณไม่สามารถเข้าถึง php.ini ของคุณคุณมีอีกสองทางเลือก

คุณสามารถตั้งค่าบรรทัดนี้ได้โดยตรงในไฟล์ "name.php" ของคุณ แต่ฉันไม่พบตัวเลือก upload_max_filesize สำหรับตัวเลือกนี้:

set_time_limit(0);

หรือใน ".htaccess"

php_value upload_max_filesize 0
php_value max_execution_time 0

9

หากสิ่งที่คุณต้องทำเฉพาะสำหรับ 1 หรือ 2 เพจฉันขอแนะนำให้ใช้set_time_limitดังนั้นจึงไม่มีผลกับแอปพลิเคชันทั้งหมด

set_time_limit(some_values);

แต่แน่นอนว่าค่า 2 ค่านี้ (post_max_size & upload_max_filesize) อาจถูกตรวจสอบ

คุณสามารถตั้งมันผ่านini_setฟังก์ชั่น

ini_set('post_max_size','20M');
ini_set('upload_max_filesize','2M');

หรือโดยตรงในไฟล์ php.ini เช่นการตอบสนองด้านบนโดย Hannes หรือแม้กระทั่งตั้งค่าเป็น iin .htaccess เช่นด้านล่าง

php_value upload_max_filesize 2M
php_value post_max_size 20M

6

หากคุณใช้เซิร์ฟเวอร์Microsoft IISนอกเหนือจากการตั้งค่าphp.ini ที่กล่าวถึงโดยผู้อื่นคุณอาจต้องเพิ่มการตั้งค่าการหมดเวลาการดำเนินการสำหรับแอปพลิเคชัน PHP FastCGI ในตัวจัดการเซิร์ฟเวอร์ IIS:

ขั้นตอนที่ 1) เปิดตัวจัดการเซิร์ฟเวอร์ IIS (โดยปกติจะอยู่ในตัวจัดการเซิร์ฟเวอร์ในเมนูเริ่มจากนั้นตัวจัดการเครื่องมือ / บริการข้อมูลทางอินเทอร์เน็ต (IIS) )

ขั้นตอนที่ 2) คลิกที่การเชื่อมต่อหลัก (ไม่เฉพาะเจาะจงกับโดเมนใดโดเมนหนึ่ง)

ขั้นตอนที่ 3) ในส่วนIISค้นหาการตั้งค่า FastCGI (แสดงด้านล่าง)

ป้อนคำอธิบายภาพที่นี่

ขั้นตอนที่ 4) จากนั้นคลิกขวาที่แอปพลิเคชัน PHP แล้วเลือกแก้ไข ......

ขั้นตอนที่ 5) ตรวจสอบการหมดเวลา (แสดงด้านล่าง)

ป้อนคำอธิบายภาพที่นี่

ในกรณีของฉันระยะหมดเวลาเริ่มต้นที่นี่คือ 70 และ 90 วินาที อดีตที่ก่อให้เกิดข้อผิดพลาด 500 เซิร์ฟเวอร์ภายในบนสคริปต์ PHP ที่ใช้เวลานานกว่า 70 วินาที


5

นอกเหนือจากคำตอบข้างต้นคุณสามารถใช้ set_time_limit()ฟังก์ชัน:

http://php.net/manual/en/function.set-time-limit.php

การส่งผ่าน0เป็นอาร์กิวเมนต์จะทำให้สคริปต์ของคุณทำงานโดยไม่ จำกัด เวลา


set_time_limit () ไม่มีส่วนเกี่ยวข้องกับการอัปโหลดไฟล์
สามัญสำนึกของคุณ

1
นี่ไม่แม่นยำพอ พ.อ. Shrapnel ในขณะที่อยู่ในสภาพแวดล้อม Unix เวลาในการประมวลผลสูงสุดจะถูกเปรียบเทียบกับเวลา CPU สะสมที่ใช้โดย php-thread บนระบบ windows จะใช้เวลาสัมบูรณ์ การอัปโหลดส่วนใหญ่เป็น "เวลาว่าง" (IO-Wait) แต่อย่างที่คุณเห็นการอัปโหลดอาจหยุดลงได้เมื่อใช้เวลานานเกินไป
Christoph Strasen

3

คุณพิมพ์ผิด: ini_set ('max_input_time', '200M') - ชุดค่าต้องเป็น int เช่น ini_set ('max_input_time', '200')


2

ฉันรู้ว่าคุณกำลังถามเป็นพิเศษเกี่ยวกับการหมดเวลาของ PHP แต่สิ่งที่ดูเหมือนจะไม่มีใครพูดถึงก็คืออาจมีการหมดเวลาบนเว็บเซิร์ฟเวอร์และอาจดูคล้ายกับการหมดเวลาของ PHP

ดังนั้นหากคุณได้ลอง:

  1. เพิ่มระยะหมดเวลาใน php.ini โดยการเพิ่มบรรทัด: max_execution_time = {จำนวนวินาทีเช่น 60 ต่อหนึ่งนาที}
  2. การเพิ่มระยะหมดเวลาในสคริปต์ของคุณเองโดยการเพิ่ม: ini_set ('max_execution_time', '{number of seconds ie 60 for one minute}');

และคุณได้ตรวจสอบด้วยฟังก์ชัน phpinfo () แล้วว่า max_execution_time ได้เพิ่มขึ้นแล้วคุณอาจต้องการลองเพิ่มสิ่งนี้ใน. htaccess ซึ่งจะทำให้แน่ใจว่า Apache จะไม่หมดเวลา:

RewriteRule .* - [E=noabort:1]
RewriteRule .* - [E=noconntimeout:1]

ข้อมูลเพิ่มเติมที่นี่: https://www.antropy.co.uk/blog/php-script-keeps-timing-out-desunate-ini-set/


2

ขั้นแรกให้ตรวจสอบphp.iniเส้นทางไฟล์โดยphpinfo(); จากนั้นเปลี่ยนPHP.INIพารามิเตอร์:

upload_max_filesize = 1000M
memory_limit = 1500M
post_max_size = 1500M
max_execution_time = 30

รีสตาร์ท Apache

set_time_limit(0); // safe_mode is off

ini_set('max_execution_time', 500); //500 seconds

หมายเหตุ : คุณยังสามารถใช้คำสั่งเพื่อค้นหาphp.iniใน Linux

locate `php.ini`

1

หากคุณไม่สามารถแก้ไข php.ini (เช่นบนเซิร์ฟเวอร์ของคุณ) คุณสามารถลองเปลี่ยนพารามิเตอร์ php.ini จากภายในโค้ด php ของคุณ ลอง:

ini_set('max_execution_time', 'NUMBER OF SECONDS TO ALLOW BEFORE TIMEOUT');

หากไม่ได้ผลให้ลองตั้งค่า 'set_time_limit' ด้วยวิธีเดียวกันนอกเหนือจากนั้นฉันจะบอกว่าทางเลือกเดียวของคุณคือติดต่อโฮสต์ของคุณ ไม่สามารถแก้ไขการตั้งค่าเหล่านี้ได้ขณะอยู่ในเซฟโหมด


3
ฮันเนสมีเวลาหนึ่งนาทีก่อนที่ฉันจะโพสต์และชี้ให้เห็นอย่างถูกต้องว่า set_time_limit () ไม่ควรตั้งค่าโดย ini_set ตามที่ระบุไว้ในคำตอบนี้ แต่ให้ใส่วินาทีไว้ในวงเล็บ โหวตฮันเนสแล้ว
จอห์น

1

ทดสอบว่าคุณอยู่ในโหมดปลอดภัยหรือไม่ - ถ้าไม่ - ตั้งค่าการ จำกัด เวลา (Local Value) ตามที่คุณต้องการ:

if(!ini_get('safe_mode')){

    echo "safe mode off";
    set_time_limit(180);// seconds

    phpinfo();// see 'max_execution_time'
}

* คุณไม่สามารถตั้งค่าการ จำกัด เวลาด้วยวิธีนี้หากเซฟโหมด "เปิด"


1

ทางเลือก: หากคุณตั้งค่า config เกี่ยวกับ php.ini แต่ยังไม่สามารถอัพโหลดได้

- นี่คือฟังก์ชัน php เพื่อตรวจสอบรหัสข้อผิดพลาด

$error_type = [];
$error_type[0] = "There is no error";
$error_type[1] = "The uploaded file exceeds the upload_max_filesize directive in php.ini.";
$error_type[2] = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.";
$error_type[3] = "The uploaded file was only partially uploaded.";
$error_type[4] = "No file was uploaded.";
//$error_type["5"] = "";
$error_type[6] = "Missing a temporary folder. Introduced in PHP 5.0.3.";
$error_type[7] = "Failed to write file to disk. Introduced in PHP 5.1.0.";
$error_type[8] = "A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.";
//------------------------------
//--> show msg error.
$status_code = $_FILES["uploadfile"]["error"];
if($status_code != 0){
    echo $error_type[$status_code];
    exit;
}


0

ในการเพิ่มระยะเวลาจริงๆฉันต้องการรับค่าปัจจุบันก่อน set_time_limitไม่ใช่การเพิ่มระยะเวลาเสมอไป หากค่าปัจจุบัน (เช่นจากphp.iniหรือที่เคยตั้งไว้) สูงกว่าค่าที่ใช้ในการโทรปัจจุบันset_time_limitจะลดระยะเวลาลง !

แล้วตัวช่วยเล็ก ๆ แบบนี้คืออะไร?

/**
 * @param int $seconds Time in seconds
 * @return bool
 */
function increase_time_limit(int $seconds): bool
{
    return set_time_limit(max(
        ini_get('max_execution_time'), $seconds
    ));
}

// somewhere else in your code
increase_time_limit(180);

ดูเพิ่มเติม: รับmax_execution_time ในสคริปต์ PHP

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.