What are best practices for securely handling file uploads in PHP to prevent security vulnerabilities?

When handling file uploads in PHP, it is crucial to implement proper security measures to prevent vulnerabilities such as arbitrary code execution or file inclusion attacks. One of the best practices is to restrict the allowed file types, validate file sizes, and store uploaded files outside the web root directory to prevent direct access.

// Check if file upload is successful
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    // Validate file type
    $allowedTypes = ['image/jpeg', 'image/png'];
    if (in_array($_FILES['file']['type'], $allowedTypes)) {
        // Validate file size
        if ($_FILES['file']['size'] <= 5000000) {
            // Move uploaded file to a secure directory
            $uploadDir = '/path/to/secure/uploads/';
            $uploadFile = $uploadDir . basename($_FILES['file']['name']);
            if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
                echo 'File uploaded successfully.';
            } else {
                echo 'Failed to move file.';
            }
        } else {
            echo 'File size exceeds limit.';
        }
    } else {
        echo 'Invalid file type.';
    }
} else {
    echo 'File upload error.';
}