首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

不常見卻極其實用的 10 個 PHP 函數

     編輯:PHP 相關知識

前言

PHP 函數庫浩如煙海,許多強大函數因文檔不顯眼、名字不直觀而被忽視。本文精選 10 個「知之者少、用之者強」的函數,附帶實戰場景與代碼片段。

1. gc_collect_cycles —— 強制垃圾回收

// 長運行腳本(Worker、CLI 守護進程)中,定期調用釋放循環引用內存
while (true) {
    processTask();
    if (++$counter % 100 === 0) {
        gc_collect_cycles(); // 防內存緩慢增長
    }
}

2. fastcgi_finish_request —— 響應後繼續執行

// PHP-FPM 環境下:立即返回給瀏覽器,後台繼續耗時操作
echo json_encode(['status' => 'accepted']);
fastcgi_finish_request(); // 關鍵:發送響應、關閉連接

// 以下代碼在用戶已收到響應後繼續執行
sendWelcomeEmail($userId);
generateReport($orderId);
pushToAnalytics($eventData);

3. stream_context_create / file_get_contents —— 無需 cURL 發高級 HTTP 請求

$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/json\r\nAuthorization: Bearer $token",
        'content' => json_encode($payload),
        'timeout' => 10,
        'ignore_errors' => true, // 獲取 4xx/5xx 響應體
    ],
    'ssl' => [
        'verify_peer' => true,
        'verify_peer_name' => true,
    ],
]);

$response = file_get_contents('https://api.example.com/v1/resource', false, $context);
$httpCode = $http_response_header[0] ?? 'HTTP/1.0 000';

4. array_reduce —— 函數式聚合利器

$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $item) => $carry + $item, 0); // 15

// 實戰:將多維陣列扁平化
$flat = array_reduce($nested, fn($carry, $item) => array_merge($carry, (array)$item), []);

// 實戰:分組統計
$byStatus = array_reduce($orders, function ($carry, $order) {
    $carry[$order['status']] = ($carry[$order['status']] ?? 0) + 1;
    return $carry;
}, []);

5. debug_print_backtrace / debug_backtrace —— 運行時調用鏈檢視

// 生產環境條件記錄調用鏈(如異常 SQL、棄用函數調用)
if (config('app.debug_sql')) {
    debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT);
}

6. spl_autoload_register —— 現代自動加載基石

// PSR-4 簡易實現
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    if (str_starts_with($class, $prefix)) {
        $file = $baseDir . str_replace('\\', '/', substr($class, strlen($prefix))) . '.php';
        if (file_exists($file)) require $file;
    }
});

7. iterator_to_array / iterator_count / iterator_apply —— 迭代器轉陣列/計數/應用

$dir = new RecursiveDirectoryIterator('/var/log');
$iter = new RecursiveIteratorIterator($dir);
$files = iterator_to_array($iter); // 遞歸獲取所有文件路徑
$count = iterator_count($iter);    // 不加載到內存直接計數

8. password_hash / password_verify / password_needs_rehash —— 密碼安全三件套

$hash = password_hash($plain, PASSWORD_DEFAULT); // 自動選擇最強算法
if (password_verify($input, $hash)) { /* 登錄成功 */ }
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {
    // 算法過舊或成本不足,重新哈希存儲
    $newHash = password_hash($plain, PASSWORD_DEFAULT, ['cost' => 12]);
    $user->update(['password' => $newHash]);
}

9. proc_open / proc_get_status —— 進程級管道控制

$descriptors = [
    0 => ['pipe', 'r'], // stdin
    1 => ['pipe', 'w'], // stdout
    2 => ['pipe', 'w'], // stderr
];
$proc = proc_open('php worker.php', $descriptors, $pipes);
if (is_resource($proc)) {
    fwrite($pipes[0], json_encode($taskData));
    fclose($pipes[0]);
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $status = proc_get_status($proc);
    proc_close($proc);
    // $status['exitcode'], $status['pid'], $status['running']
}

10. register_shutdown_function —— 腳本終結前的最後一舞

register_shutdown_function(function () {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        // 致命錯誤上報 Sentry、發送告警、記錄關鍵上下文
        logger()->critical('Fatal error', $error);
    }
    // 釋放鎖、關閉連接、刷新緩衝區
});

總結

這 10 個函數覆蓋:內存管理、異步響應、網絡請求、函數式聚合、調試追蹤、自動加載、文件遍歷、密碼安全、進程控制、錯誤收尾。將它們納入工具箱,解決棘手問題將更加得心應手。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved