欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP集成FFmpeg實(shí)現(xiàn)音視頻處理的完整指南

 更新時(shí)間:2025年08月22日 08:37:01   作者:BingoGo  
視頻處理已經(jīng)成為現(xiàn)代 Web 應(yīng)用的“標(biāo)配”,從社交媒體到在線教育:格式轉(zhuǎn)換、縮略圖抽取、壓縮優(yōu)化、音軌處理與合成,都離不開(kāi)穩(wěn)定強(qiáng)大的工具鏈,本文給出一套面向生產(chǎn)的實(shí)踐指南,帶你快速、穩(wěn)健地將 FFmpeg 與 PHP 集成,需要的朋友可以參考下

引言

視頻處理已經(jīng)成為現(xiàn)代 Web 應(yīng)用的“標(biāo)配”,從社交媒體到在線教育:格式轉(zhuǎn)換、縮略圖抽取、壓縮優(yōu)化、音軌處理與合成,都離不開(kāi)穩(wěn)定強(qiáng)大的工具鏈。FFmpeg 作為事實(shí)標(biāo)準(zhǔn),功能強(qiáng)大但命令行參數(shù)繁多;在 PHP 中直接集成若處理不當(dāng),容易踩到錯(cuò)誤處理、資源管理與安全風(fēng)控的坑。

本文給出一套面向生產(chǎn)的實(shí)踐指南,帶你快速、穩(wěn)健地將 FFmpeg 與 PHP 集成,覆蓋常用庫(kù)選擇、安裝與環(huán)境準(zhǔn)備、核心用法、進(jìn)階技巧、性能優(yōu)化、安全要點(diǎn)與常見(jiàn)故障排查。配合完整的代碼示例,你可以在短時(shí)間內(nèi)搭建可靠的音視頻處理能力。

理解 FFmpeg 與 PHP 集成

什么是 FFmpeg?

FFmpeg 是跨平臺(tái)的音視頻錄制、轉(zhuǎn)換與流媒體處理套件,是諸多應(yīng)用(如 YouTube、Netflix、VLC)的底層基石。它支持?jǐn)?shù)百種編解碼器與容器格式,是多媒體處理領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。

為什么要把 FFmpeg 集成到 PHP?

  • 內(nèi)容管理系統(tǒng):上傳后自動(dòng)抽取縮略圖、轉(zhuǎn)碼輸出多種格式
  • 在線教育:批量處理教學(xué)素材,生成預(yù)覽片段
  • 社交媒體:面向不同設(shè)備與帶寬進(jìn)行優(yōu)化轉(zhuǎn)碼
  • 播發(fā)/直播:為不同協(xié)議/清晰度產(chǎn)出合適的輸出流

直接調(diào)用 FFmpeg 的常見(jiàn)挑戰(zhàn)

通過(guò) exec()/shell_exec() 直接調(diào)用 FFmpeg 往往會(huì)遇到:

  • 命令復(fù)雜、參數(shù)管理困難
  • 錯(cuò)誤處理與調(diào)試信息不足
  • 內(nèi)存與臨時(shí)文件管理不當(dāng)引起的資源問(wèn)題
  • 輸入未凈化導(dǎo)致的安全風(fēng)險(xiǎn)
  • 難以獲取與上報(bào)處理進(jìn)度

PHP 側(cè)可選庫(kù)與方案

PHP-FFMpeg(推薦)

最流行且維護(hù)活躍的 OO 封裝庫(kù),大幅簡(jiǎn)化常見(jiàn)視頻任務(wù)。

安裝(Composer):

composer require php-ffmpeg/php-ffmpeg

基礎(chǔ)示例:

<?php
require 'vendor/autoload.php';

use FFMpeg\FFMpeg;
use FFMpeg\Coordinate\Dimension;
use FFMpeg\Format\Video\X264;

// 初始化 FFMpeg
$ffmpeg = FFMpeg::create([
    'ffmpeg.binaries'  => '/usr/local/bin/ffmpeg',
    'ffprobe.binaries' => '/usr/local/bin/ffprobe',
    'timeout'          => 3600,
    'ffmpeg.threads'   => 12,
]);

// 打開(kāi)視頻文件
$video = $ffmpeg->open('input.mp4');

// 轉(zhuǎn)換為另一種格式
$format = new X264('aac');
$format->setKiloBitrate(1000)
       ->setAudioChannels(2)
       ->setAudioKiloBitrate(256);

$video->save($format, 'output.mp4');

特性亮點(diǎn)

  • 格式支持廣:編解碼器與容器覆蓋面大
  • 過(guò)濾器體系:內(nèi)置多種視頻濾鏡/管線
  • 進(jìn)度監(jiān)聽(tīng):可獲取實(shí)時(shí)處理進(jìn)度
  • 幀提取:便捷抽幀/縮略圖生成
  • 音頻處理:完整音頻編解碼與操作

FFMpeg-PHP 擴(kuò)展

通過(guò)編譯 PHP 擴(kuò)展直接調(diào)用 FFmpeg 庫(kù),部署復(fù)雜度更高,但高吞吐下性能更優(yōu)。

安裝依賴(以 Debian/Ubuntu 為例):

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

git clone https://github.com/char101/ffmpeg-php.git
cd ffmpeg-php
phpize
./configure
make && sudo make install

用法示例:

<?php
$movie = new ffmpeg_movie('input.mp4');

echo "Duration: " . $movie->getDuration() . " seconds\n";
echo "Frame count: " . $movie->getFrameCount() . "\n";
echo "Frame rate: " . $movie->getFrameRate() . " fps\n";

// 在第 10 秒抽取一幀
$frame = $movie->getFrame(10);
if ($frame) {
    $gd_image = $frame->toGDImage();
    imagepng($gd_image, 'thumbnail.png');
}

StreamIO FFMPEG Wrapper

主打輕量與易用,適合基礎(chǔ)處理任務(wù)。

安裝:

composer require streamio/ffmpeg

簡(jiǎn)單轉(zhuǎn)換示例:

<?php
use Streamio\FFMpeg;

$ffmpeg = new FFMpeg('/usr/local/bin/ffmpeg');

$ffmpeg->convert()
    ->input('input.avi')
    ->output('output.mp4')
    ->go();

環(huán)境準(zhǔn)備與安裝

系統(tǒng)要求

  • FFmpeg:建議 4.0+
  • PHP:建議 7.4+(與大多數(shù)庫(kù)兼容更好)
  • 內(nèi)存:至少 2GB(視頻處理需額外緩存與臨時(shí)文件)
  • 磁盤:足夠的臨時(shí)與輸出空間

安裝 FFmpeg

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg

CentOS/RHEL:

sudo yum install epel-release
sudo yum install ffmpeg

macOS(Homebrew):

brew install ffmpeg

基礎(chǔ)視頻處理場(chǎng)景

視頻格式轉(zhuǎn)換

<?php
use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\WebM;
use FFMpeg\Format\Video\MP4;

class VideoConverter
{
    private $ffmpeg;

    public function __construct()
    {
        $this->ffmpeg = FFMpeg::create([
            'ffmpeg.binaries'  => '/usr/bin/ffmpeg',
            'ffprobe.binaries' => '/usr/bin/ffprobe',
            'timeout'          => 3600,
            'ffmpeg.threads'   => 8,
        ]);
    }

    public function convertToMP4($inputPath, $outputPath, $quality = 'medium')
    {
        try {
            $video = $this->ffmpeg->open($inputPath);

            $format = new MP4('aac', 'libx264');

            // 設(shè)置質(zhì)量參數(shù)
            switch ($quality) {
                case 'high':
                    $format->setKiloBitrate(2000);
                    break;
                case 'medium':
                    $format->setKiloBitrate(1000);
                    break;
                case 'low':
                    $format->setKiloBitrate(500);
                    break;
            }

            $video->save($format, $outputPath);
            return ['success' => true, 'message' => 'Conversion completed'];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }
}

// 用法
$converter = new VideoConverter();
$result = $converter->convertToMP4('input.avi', 'output.mp4', 'high');

縮略圖生成(抽幀)

<?php
use FFMpeg\FFMpeg;
use FFMpeg\Coordinate\TimeCode;

class ThumbnailGenerator
{
    private $ffmpeg;

    public function __construct()
    {
        $this->ffmpeg = FFMpeg::create();
    }

    public function generateThumbnails($videoPath, $outputDir, $count = 5)
    {
        try {
            $video = $this->ffmpeg->open($videoPath);
            $duration = $video->getFFProbe()
                             ->format($videoPath)
                             ->get('duration');

            $interval = $duration / ($count + 1);
            $thumbnails = [];

            for ($i = 1; $i <= $count; $i++) {
                $timeSeconds = $interval * $i;
                $outputPath = $outputDir . '/thumb_' . $i . '.jpg';

                $video->frame(TimeCode::fromSeconds($timeSeconds))
                      ->save($outputPath);

                $thumbnails[] = $outputPath;
            }

            return ['success' => true, 'thumbnails' => $thumbnails];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }
}

視頻信息解析

<?php
use FFMpeg\FFProbe;

class VideoAnalyzer
{
    private $ffprobe;

    public function __construct()
    {
        $this->ffprobe = FFProbe::create();
    }

    public function getVideoInfo($videoPath)
    {
        try {
            $format = $this->ffprobe->format($videoPath);
            $videoStream = $this->ffprobe->streams($videoPath)
                                        ->videos()
                                        ->first();

            $audioStream = $this->ffprobe->streams($videoPath)
                                        ->audios()
                                        ->first();

            return [
                'success' => true,
                'info' => [
                    'duration' => $format->get('duration'),
                    'size' => $format->get('size'),
                    'bitrate' => $format->get('bit_rate'),
                    'video' => [
                        'codec' => $videoStream->get('codec_name'),
                        'width' => $videoStream->get('width'),
                        'height' => $videoStream->get('height'),
                        'fps' => $videoStream->get('r_frame_rate'),
                    ],
                    'audio' => $audioStream ? [
                        'codec' => $audioStream->get('codec_name'),
                        'channels' => $audioStream->get('channels'),
                        'sample_rate' => $audioStream->get('sample_rate'),
                    ] : null
                ]
            ];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }
}

進(jìn)階視頻處理

尺寸調(diào)整與縱橫比處理

<?php
use FFMpeg\FFMpeg;
use FFMpeg\Coordinate\Dimension;
use FFMpeg\Filters\Video\ResizeFilter;
use FFMpeg\Format\Video\X264;

class VideoResizer
{
    private $ffmpeg;

    public function __construct()
    {
        $this->ffmpeg = FFMpeg::create();
    }

    public function resizeVideo($inputPath, $outputPath, $width, $height, $mode = ResizeFilter::RESIZEMODE_INSET)
    {
        try {
            $video = $this->ffmpeg->open($inputPath);

            // 創(chuàng)建尺寸對(duì)象
            $dimension = new Dimension($width, $height);

            // 應(yīng)用縮放濾鏡
            $video->filters()
                  ->resize($dimension, $mode)
                  ->synchronize();

            // 保存為適當(dāng)?shù)母袷?
            $format = new X264('aac');
            $video->save($format, $outputPath);

            return ['success' => true, 'message' => 'Video resized successfully'];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }

    public function createMultipleResolutions($inputPath, $outputDir)
    {
        $resolutions = [
            '720p' => ['width' => 1280, 'height' => 720],
            '480p' => ['width' => 854, 'height' => 480],
            '360p' => ['width' => 640, 'height' => 360],
        ];

        $results = [];

        foreach ($resolutions as $name => $dimensions) {
            $outputPath = $outputDir . '/' . $name . '_output.mp4';
            $result = $this->resizeVideo(
                $inputPath,
                $outputPath,
                $dimensions['width'],
                $dimensions['height']
            );
            $results[$name] = $result;
        }

        return $results;
    }
}

音頻處理與提取

<?php
use FFMpeg\FFMpeg;
use FFMpeg\Format\Audio\Mp3;
use FFMpeg\Format\Audio\Wav;

class AudioProcessor
{
    private $ffmpeg;

    public function __construct()
    {
        $this->ffmpeg = FFMpeg::create();
    }

    public function extractAudio($videoPath, $outputPath, $format = 'mp3')
    {
        try {
            $video = $this->ffmpeg->open($videoPath);

            switch (strtolower($format)) {
                case 'mp3':
                    $audioFormat = new Mp3();
                    $audioFormat->setAudioKiloBitrate(192);
                    break;
                case 'wav':
                    $audioFormat = new Wav();
                    break;
                default:
                    throw new Exception('Unsupported audio format');
            }

            $video->save($audioFormat, $outputPath);

            return ['success' => true, 'message' => 'Audio extracted successfully'];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }

    public function adjustVolume($inputPath, $outputPath, $volumeLevel)
    {
        try {
            $audio = $this->ffmpeg->open($inputPath);

            // 應(yīng)用音量濾鏡
            $audio->filters()
                  ->custom("volume={$volumeLevel}");

            $format = new Mp3();
            $audio->save($format, $outputPath);

            return ['success' => true, 'message' => 'Volume adjusted successfully'];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }
}

性能優(yōu)化與最佳實(shí)踐

內(nèi)存管理

<?php
use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\X264;

class OptimizedVideoProcessor
{
    private $ffmpeg;
    private $maxMemoryUsage;

    public function __construct($maxMemoryMB = 512)
    {
        $this->maxMemoryUsage = $maxMemoryMB * 1024 * 1024;

        $this->ffmpeg = FFMpeg::create([
            'ffmpeg.binaries'  => '/usr/bin/ffmpeg',
            'ffprobe.binaries' => '/usr/bin/ffprobe',
            'timeout'          => 3600,
            'ffmpeg.threads'   => min(4, cpu_count()),
        ]);
    }

    public function processWithMemoryCheck($inputPath, $outputPath)
    {
        // 處理前的內(nèi)存檢查
        $memoryBefore = memory_get_usage(true);

        if ($memoryBefore > $this->maxMemoryUsage * 0.8) {
            return ['success' => false, 'error' => 'Insufficient memory'];
        }

        try {
            $video = $this->ffmpeg->open($inputPath);

            $format = new X264('aac');
            $format->setKiloBitrate(1000);

            $video->save($format, $outputPath);

            // 強(qiáng)制釋放
            unset($video);
            gc_collect_cycles();

            return ['success' => true, 'message' => 'Processing completed'];

        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }
}

進(jìn)度監(jiān)控

<?php
use FFMpeg\Format\ProgressListener\AbstractProgressListener;
use FFMpeg\Format\Video\X264;

class ProgressTracker extends AbstractProgressListener
{
    private $sessionId;

    public function __construct($sessionId)
    {
        $this->sessionId = $sessionId;
    }

    public function handle($type, $format, $percentage)
    {
        // 將進(jìn)度寫(xiě)入緩存/數(shù)據(jù)庫(kù)
        file_put_contents(
            '/tmp/progress_' . $this->sessionId,
            json_encode([
                'type' => $type,
                'format' => $format,
                'percentage' => $percentage,
                'timestamp' => time()
            ])
        );
    }
}

// 結(jié)合進(jìn)度監(jiān)聽(tīng)的用法
$progressTracker = new ProgressTracker('unique_session_id');
$format = new X264('aac');
$format->on('progress', $progressTracker);

$video->save($format, 'output.mp4');

健壯的錯(cuò)誤處理與日志

<?php
use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\X264;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

class RobustVideoProcessor
{
    private $ffmpeg;
    private $logger;

    public function __construct()
    {
        $this->ffmpeg = FFMpeg::create([
            'timeout' => 3600,
        ]);

        $this->logger = new Logger('video_processor');
        $this->logger->pushHandler(new StreamHandler('/var/log/video_processing.log'));
    }

    public function safeProcessVideo($inputPath, $outputPath)
    {
        try {
            // 基礎(chǔ)校驗(yàn)
            if (!file_exists($inputPath)) {
                throw new Exception('Input file does not exist');
            }

            if (!is_readable($inputPath)) {
                throw new Exception('Input file is not readable');
            }

            // 可用磁盤空間檢查
            $freeSpace = disk_free_space(dirname($outputPath));
            $inputSize = filesize($inputPath);

            if ($freeSpace < ($inputSize * 2)) {
                throw new Exception('Insufficient disk space');
            }

            $this->logger->info('Starting video processing', [
                'input' => $inputPath,
                'output' => $outputPath
            ]);

            $video = $this->ffmpeg->open($inputPath);
            $format = new X264('aac');

            $video->save($format, $outputPath);

            $this->logger->info('Video processing completed successfully');

            return ['success' => true, 'message' => 'Processing completed'];

        } catch (Exception $e) {
            $this->logger->error('Video processing failed', [
                'error' => $e->getMessage(),
                'input' => $inputPath,
                'output' => $outputPath
            ]);

            // 清理半成品
            if (file_exists($outputPath)) {
                unlink($outputPath);
            }

            return ['success' => false, 'error' => $e->getMessage()];
        }
    }
}

常見(jiàn)問(wèn)題與故障排查

二進(jìn)制路徑問(wèn)題

報(bào)錯(cuò) “FFmpeg not found” 時(shí),顯式指定路徑:

$ffmpeg = FFMpeg::create([
    'ffmpeg.binaries'  => '/usr/local/bin/ffmpeg',  // 按需調(diào)整
    'ffprobe.binaries' => '/usr/local/bin/ffprobe', // 按需調(diào)整
]);

超時(shí)問(wèn)題

長(zhǎng)視頻任務(wù)需提高超時(shí)時(shí)間:

$ffmpeg = FFMpeg::create([
    'timeout' => 7200, // 2 小時(shí)
    'ffmpeg.threads' => 4,
]);

內(nèi)存限制

設(shè)置合適的 PHP 限制并控制執(zhí)行時(shí)長(zhǎng):

ini_set('memory_limit', '1G');
ini_set('max_execution_time', 3600);

權(quán)限問(wèn)題

確保目錄可被 PHP 進(jìn)程讀寫(xiě):

chmod 755 /path/to/videos/
chown www-data:www-data /path/to/videos/

安全注意事項(xiàng)

輸入校驗(yàn)

嚴(yán)禁未凈化的路徑與文件名進(jìn)入命令行。示例:

<?php
function validateVideoPath($path)
{
    // 目錄穿越
    if (strpos($path, '..') !== false) {
        throw new Exception('Invalid path');
    }

    // 擴(kuò)展名校驗(yàn)
    $allowedExtensions = ['mp4', 'avi', 'mov', 'mkv', 'webm'];
    $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));

    if (!in_array($extension, $allowedExtensions)) {
        throw new Exception('Unsupported file format');
    }

    return true;
}

資源限制

對(duì)文件大小與時(shí)長(zhǎng)設(shè)置上限,避免濫用:

<?php
use FFMpeg\FFProbe;

class SecureVideoProcessor
{
    private $maxFileSize = 100 * 1024 * 1024; // 100MB
    private $maxDuration = 3600; // 1 小時(shí)

    public function validateVideo($path)
    {
        $size = filesize($path);
        if ($size > $this->maxFileSize) {
            throw new Exception('File too large');
        }

        $probe = FFProbe::create();
        $duration = $probe->format($path)->get('duration');

        if ($duration > $this->maxDuration) {
            throw new Exception('Video too long');
        }

        return true;
    }
}

常見(jiàn)問(wèn)答(FAQ)

Q:最簡(jiǎn)單的入門方式是什么?
A: 使用 PHP-FFMpeg 通過(guò) Composer 安裝(composer require php-ffmpeg/php-ffmpeg)。該庫(kù)提供直觀的 OO API,覆蓋大多數(shù)常見(jiàn)任務(wù),無(wú)需深入 FFmpeg 細(xì)節(jié)。

Q:如何處理大文件避免內(nèi)存問(wèn)題?
A: 合理設(shè)置 PHP 內(nèi)存與超時(shí);能流式就流式;實(shí)現(xiàn)進(jìn)度監(jiān)控;將長(zhǎng)任務(wù)放入后臺(tái)隊(duì)列(如 Laravel Queue、Symfony Messenger),必要時(shí)分片處理。

Q:能否并發(fā)處理多段視頻?
A: 可以,但務(wù)必限制并發(fā)度與系統(tǒng)資源占用。通過(guò)進(jìn)程控制或作業(yè)隊(duì)列協(xié)調(diào),防止 CPU、內(nèi)存、磁盤與 I/O 壓垮系統(tǒng)。

Q:如何在不同服務(wù)器上統(tǒng)一 FFmpeg 安裝?
A: 建議使用 Docker 做環(huán)境封裝,或在部署流程中編寫(xiě)一致的安裝腳本,固定 FFmpeg 版本與編譯參數(shù),并記錄依賴。

Q:怎么優(yōu)化視頻處理性能?
A: 合理配置線程數(shù)與超時(shí);選擇高效編解碼器與檔位;緩存中間結(jié)果;監(jiān)控系統(tǒng)資源(CPU/內(nèi)存/磁盤/網(wǎng)絡(luò));按需橫向擴(kuò)展。

Q:允許用戶上傳并處理視頻是否安全?
A: 嚴(yán)格做類型校驗(yàn)、大小/時(shí)長(zhǎng)限制、路徑凈化、沙箱/隔離執(zhí)行,避免命令注入。永遠(yuǎn)不要信任用戶輸入。

結(jié)語(yǔ)

將 FFmpeg 集成進(jìn) PHP 能為你的應(yīng)用解鎖強(qiáng)大的多媒體處理能力。選擇合適的庫(kù)(多數(shù)場(chǎng)景推薦 PHP-FFMpeg),建立完備的錯(cuò)誤處理與安全策略,結(jié)合合理的性能優(yōu)化與資源管理,即可在生產(chǎn)環(huán)境獲得穩(wěn)定可靠的效果。

以上就是PHP集成FFmpeg實(shí)現(xiàn)音視頻處理的完整指南的詳細(xì)內(nèi)容,更多關(guān)于PHP FFmpeg音視頻處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用PHP自動(dòng)生成印有用戶信息的名片

    利用PHP自動(dòng)生成印有用戶信息的名片

    對(duì)于日常照片的處理場(chǎng)景,通常我們的選擇都是利用手機(jī)上的眾多P圖軟件。使用它們就可以輕松便捷的實(shí)現(xiàn)添加文字的功能。而作為碼農(nóng)的我們,當(dāng)某一天我們需要在編寫(xiě)的網(wǎng)頁(yè)應(yīng)用里添加這一功能時(shí),我們?cè)摾煤畏N語(yǔ)言和工具來(lái)實(shí)現(xiàn)這一目標(biāo)呢? 下面跟小編一起來(lái)看看。
    2016-08-08
  • PHP curl批處理及多請(qǐng)求并發(fā)實(shí)現(xiàn)方法分析

    PHP curl批處理及多請(qǐng)求并發(fā)實(shí)現(xiàn)方法分析

    這篇文章主要介紹了PHP curl批處理及多請(qǐng)求并發(fā)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了php curl并發(fā)請(qǐng)求處理相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • php運(yùn)用memcache的完整實(shí)例

    php運(yùn)用memcache的完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于php運(yùn)用memcache的完整實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 解決了Ajax、MySQL 和 Zend Framework 的亂碼問(wèn)題

    解決了Ajax、MySQL 和 Zend Framework 的亂碼問(wèn)題

    功夫不負(fù)有心人,花了將近一天時(shí)間,終于解決了Ajax 、MySQL 和 Zend Framework 的亂碼問(wèn)題?,F(xiàn)在總結(jié)如下,以供參考。
    2009-03-03
  • 隱性調(diào)用php程序的方法

    隱性調(diào)用php程序的方法

    比較通用的方法,下面是調(diào)用php簡(jiǎn)單的計(jì)數(shù)器。
    2009-03-03
  • PHP中多字節(jié)字符串操作實(shí)例詳解

    PHP中多字節(jié)字符串操作實(shí)例詳解

    我們所說(shuō)的多字節(jié)字符指的是不在傳統(tǒng)的 128 個(gè) ASCII 字符集中的字符,比如中文字符,下面這篇文章主要給大家介紹了關(guān)于PHP中多字節(jié)字符串操作的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 瀏覽器關(guān)閉后,能繼續(xù)執(zhí)行的php函數(shù)(ignore_user_abort)

    瀏覽器關(guān)閉后,能繼續(xù)執(zhí)行的php函數(shù)(ignore_user_abort)

    希望關(guān)閉瀏覽器后,程序能繼續(xù)在后臺(tái)跑,這種情況下需要用到ignore_user_abort()函數(shù)
    2012-08-08
  • php json相關(guān)函數(shù)用法示例

    php json相關(guān)函數(shù)用法示例

    這篇文章主要介紹了php json相關(guān)函數(shù)用法,列舉了json_encode、json_decode及json_last_error的功能,并實(shí)例分析了json_encode與json_decode函數(shù)的具體使用技巧,需要的朋友可以參考下
    2017-03-03
  • php查詢操作實(shí)現(xiàn)投票功能

    php查詢操作實(shí)現(xiàn)投票功能

    這篇文章主要為大家詳細(xì)介紹了php查詢操作實(shí)現(xiàn)投票功能的具體代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • file_get_contents獲取不到網(wǎng)頁(yè)內(nèi)容的解決方法

    file_get_contents獲取不到網(wǎng)頁(yè)內(nèi)容的解決方法

    file_get_contents獲取不到網(wǎng)頁(yè)內(nèi)容的解決方法,需要的朋友可以參考一下
    2013-03-03

最新評(píng)論