Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Driver Microsoft untuk PHP untuk SQL Server adalah ekstensi PHP yang memungkinkan Anda membaca dan menulis data di Microsoft SQL Database Engine dari skrip PHP. Paket ini mengirimkan dua driver yang membungkus Microsoft ODBC Driver for SQL Server yang sama dan berbagi opsi koneksi yang sama, sehingga Anda dapat memilih API yang sesuai dengan basis kode Anda:
-
SQLSRV mengekspos API prosedural (
sqlsrv_*fungsi) yang disesuaikan dengan fitur SQL Server. - PDO_SQLSRV mengimplementasikan antarmuka PHP Data Objects (PDO), sehingga kode yang sudah menggunakan PDO untuk basis data lain dapat menargetkan SQL Server dengan perubahan minimal.
Kedua driver terhubung ke Azure SQL Database, database SQL di Microsoft Fabric, Azure SQL Managed Instance, serta semua versi dan edisi SQL Server yang didukung (termasuk edisi Express). Mereka menggunakan aliran PHP untuk memindahkan nilai biner dan karakter besar tanpa memuatnya sepenuhnya ke memori.
Pilih titik awal Anda
- Untuk menyiapkan lingkungan pengembangan PHP dan menjalankan query pertama Anda, mulai dari Langkah 1: Konfigurasikan lingkungan pengembangan, lalu Langkah 2: Buat database SQL dan Langkah 3: Bukti konsep menghubungkan ke SQL menggunakan PHP.
- Untuk menginstal driver di Linux atau macOS, mulai dengan tutorial Instalasi untuk Linux dan macOS lalu Unduh Driver Microsoft untuk PHP untuk SQL Server.
- Untuk terhubung ke Azure SQL dengan autentikasi tanpa kata sandi, mulailah dengan Menyambung menggunakan autentikasi Microsoft Entra dan Opsi koneksi.
- Untuk membuat aplikasi yang sudah ada tahan terhadap kegagalan sementara, buka Ketahanan koneksi Idle dan Langkah 4: Terhubung dengan tahan lama ke SQL dengan PHP.
- Untuk menentukan pilihan antara SQLSRV dan PDO_SQLSRV, buka Gambaran umum Driver Microsoft untuk PHP untuk SQL Server dan Perbandingan fungsi eksekusi.
- Untuk mendiagnosis masalah instalasi, koneksi, atau kueri, buka Troubleshooting, Handling errors and warnings, dan Logging activity.
- Untuk membuat aplikasi yang sudah ada lebih cepat, buka Penyetelan Kinerja.
Garis besar produksi untuk Azure SQL
Gunakan cuplikan ini sebagai titik awal untuk koneksi Azure SQL berorientasi produksi dengan driver PDO_SQLSRV. Aplikasi ini membaca server dan database dari variabel lingkungan (misalnya, pengaturan aplikasi Azure App Service), mengautentikasi dengan identitas terkelola, mengaktifkan Transport Layer Security (TLS) dengan validasi sertifikat server, menetapkan batas waktu login yang mencakup failover saat cold start, dan menetapkan ConnectRetryCount dan ConnectRetryInterval untuk ketahanan koneksi idle SQL Server. Helper connectWithRetry dan queryWithRetry pada tingkat aplikasi menerapkan backoff eksponensial terbatas pada koneksi awal maupun setiap statement, serta memisahkan kesalahan koneksi transien (yang memerlukan koneksi baru) dari kesalahan kueri transien (yang menggunakan kembali koneksi yang sama).
Memerlukan PHP 8.0 dan versi yang lebih baru, ekstensi PDO_SQLSRV, serta Driver ODBC Microsoft untuk versi SQL Server 17.3.1.1 dan versi yang lebih baru untuk Authentication=ActiveDirectoryMsi. Untuk daftar lengkap nilai yang didukungAuthentication, lihat Hubungkan menggunakan autentikasi Microsoft Entra.
<?php
declare(strict_types=1);
// Transient errors that require a fresh connection to recover. SQLSTATE values
// starting with '08' cover ODBC connection-established and connection-broken
// states (for example, 08001, 08S01).
const CONNECT_RETRY_SQLSTATE_PREFIX = '08';
// SQL Server error codes that are transient regardless of when they surface:
// 1205 (deadlock victim), 1222 (lock request timeout), and the Azure SQL
// throttling, mid-query failover, and "database not currently available"
// codes that arrive with SQLSTATE HY000.
const TRANSIENT_SERVER_ERROR_CODES = [1205, 1222, 40501, 40613, 40197, 10928, 10929, 49918];
/**
* Open a connection, retrying transient failures with exponential backoff.
*/
function connectWithRetry(string $dsn, array $options, int $maxAttempts = 3): PDO
{
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
try {
$pdo = new PDO($dsn, null, null, $options);
error_log(sprintf('connected on attempt %d/%d', $attempt, $maxAttempts));
return $pdo;
} catch (PDOException $e) {
$sqlstate = (string) $e->getCode();
$driverCode = isset($e->errorInfo[1]) ? (int) $e->errorInfo[1] : 0;
$isTransient = str_starts_with($sqlstate, CONNECT_RETRY_SQLSTATE_PREFIX)
|| in_array($driverCode, TRANSIENT_SERVER_ERROR_CODES, true);
if (!$isTransient || $attempt === $maxAttempts) {
error_log(sprintf('connect failed on attempt %d/%d: %s', $attempt, $maxAttempts, $e->getMessage()));
throw $e;
}
$delay = 2 ** ($attempt - 1); // 1, 2, 4 seconds
error_log(sprintf('connect attempt %d hit transient %s/%d; retrying in %d seconds', $attempt, $sqlstate, $driverCode, $delay));
sleep($delay);
}
}
throw new RuntimeException('connectWithRetry exhausted retries');
}
/**
* Run a parameterized query, retrying transient statement failures on the same
* connection. Deadlocks (1205) roll back the transaction before the driver sees
* the error, so rerunning a single statement is safe. If the statement was part
* of a multistatement transaction, wrap the whole transaction in your own retry
* loop so earlier statements replay too.
*/
function queryWithRetry(PDO $pdo, string $sql, array $params = [], int $maxAttempts = 3): PDOStatement
{
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
try {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
} catch (PDOException $e) {
$driverCode = isset($e->errorInfo[1]) ? (int) $e->errorInfo[1] : 0;
$isTransient = in_array($driverCode, TRANSIENT_SERVER_ERROR_CODES, true);
if (!$isTransient || $attempt === $maxAttempts) {
error_log(sprintf('query failed on attempt %d/%d: %s', $attempt, $maxAttempts, $e->getMessage()));
throw $e;
}
$delay = 2 ** ($attempt - 1);
error_log(sprintf('query attempt %d hit transient code %d; retrying in %d seconds', $attempt, $driverCode, $delay));
sleep($delay);
}
}
throw new RuntimeException('queryWithRetry exhausted retries');
}
// Load endpoint details from application configuration. In Azure App Service,
// these can come from app settings or Key Vault-backed settings.
$server = getenv('SQL_SERVER') ?: null;
$database = getenv('SQL_DATABASE') ?: null;
if ($server === null || $database === null) {
throw new RuntimeException('Set SQL_SERVER and SQL_DATABASE in your application configuration.');
}
$dsn = sprintf(
'sqlsrv:Driver={ODBC Driver 18 for SQL Server};Server=%s;Database=%s;'
. 'Encrypt=true;TrustServerCertificate=false;'
. 'LoginTimeout=90;Authentication=ActiveDirectoryMsi;'
. 'ConnectRetryCount=5;ConnectRetryInterval=15;'
. 'MultiSubnetFailover=true;',
$server,
$database
);
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 30,
];
$pdo = connectWithRetry($dsn, $options);
$stmt = queryWithRetry($pdo, 'SELECT TOP (?) name FROM sys.databases ORDER BY name', [5]);
foreach ($stmt as $row) {
echo $row['name'], PHP_EOL;
}
Cuplikan ini dioptimalkan untuk grup failover Azure SQL Database dan Azure SQL Managed Instance.
Driver={ODBC Driver 18 for SQL Server}menempelkan driver ODBC 18. Jika host juga memiliki ODBC 17 terpasang, PDO_SQLSRV dapat mengikat ke ODBC 17. Versi build 17.x yang lebih lama menolak nilaiAuthenticationyang lebih baru; misalnya,Authentication=ActiveDirectoryMsimemerlukan ODBC 17.3.1.1 atau versi yang lebih baru. Lihat Nilai tidak valid yang ditentukan untuk atribut string koneksi 'Authentication'.ConnectRetryCountdanConnectRetryIntervalmerupakan kata kunci string koneksi ODBC yang mengaktifkan ketahanan koneksi idle SQL Server: driver secara transparan menyambungkan kembali koneksi idle yang terputus. Itu berbeda dengan tingkat aplikasiqueryWithRetry, yang mencoba kembali statemen yang gagal karena kesalahan sementara seperti deadlock atau timeout kueri. Keduanya saling melengkapi, jadi pertahankan keduanya. PastikanLoginTimeoutsetidaknyaConnectRetryCount * ConnectRetryIntervalagar jalur idle-reconnect mendapatkan anggaran penuhnya; sampel menggunakan 90 detik untuk menutupi 5 × 15 detik percobaan ulang plus ruang untuk login awal pada failover dingin.Lengkapi panggilan pada tingkat aplikasi
error_log()dengan diagnostik di sisi driver. Untuk PDO_SQLSRV, aturpdo_sqlsrv.log_severitydiphp.ini(hanya dapat diatur saat inisialisasi); untuk SQLSRV, panggilsqlsrv_configure("LogSubsystems", ...)saat aplikasi berjalan. Untuk informasi lebih lanjut, lihat Aktivitas pencatatan.; php.ini - enable PDO_SQLSRV driver diagnostics alongside the application-level ; error_log() calls in the sample. Use 1 (errors) in production; -1 (all) is ; useful during triage but very chatty. [pdo_sqlsrv] pdo_sqlsrv.log_severity = 1Untuk identitas terkelola yang diberikan pengguna , berikan ID identitas sebagai argumen PDO
$username(new PDO($dsn, $identityId, null, $options)). Gunakan ID klien milik identitas tersebut di Azure App Service atau Azure Container Instance; jika tidak, gunakan ID objeknya. Driver PHP mewarisi perilaku ini dari Microsoft ODBC Driver for SQL Server; untuk informasi lebih lanjut, lihat Menggunakan Microsoft Entra ID dengan Driver ODBC. PDO_SQLSRV menolakUIDdi dalam DSN itu sendiri, jadi gunakan slot konstruktor. Passingnullsebagai pengguna (seperti yang dilakukan sampel) memilih identitas terkelola yang diberikan sistem untuk host Azure. Untuk SQLSRV (prosedural), teruskanUIDdalam array opsi koneksi.Atur
MultiSubnetFailover=truekapan Anda terhubung ke pendengar failover-group, pendengar grup ketersediaan, atau endpoint instance failover cluster. Mengatur opsi ini meningkatkan kinerja koneksi untuk listener grup ketersediaan subnet tunggal maupun multi-subnet. Untuk informasi lebih lanjut, lihat Dukungan untuk Ketersediaan Tinggi, pemulihan bencana.Untuk peluasan baca atau sekunder yang dapat dibaca, tambahkan
ApplicationIntent=ReadOnlyke Nama Sumber Data (DSN).Untuk sovereign cloud di mana sertifikat Subject Alternative Name (SAN) tidak mencakup host yang Anda hubungkan, tambahkan
HostNameInCertificateke DSN (misalnya,*.database.usgovcloudapi.netuntuk Azure Government).Driver ini bergantung pada Microsoft ODBC Driver for SQL Server yang menjadi dasar untuk akuisisi token. Identitas terkelola, prinsipal layanan, dan alur token akses semuanya melewati ODBC. Untuk informasi selengkapnya, lihat Menggunakan Microsoft Entra ID dengan Driver ODBC.
Untuk keamanan dan portabilitas yang lebih tinggi antar lingkungan, simpan informasi koneksi di luar kode Anda. Simpan informasi koneksi di sistem konfigurasi aplikasi Anda, dan gunakan Azure Key Vault untuk nilai sensitif dan pengaturan koneksi yang dikelola secara terpusat.
Koneksi SQLSRV yang setara menggunakan
sqlsrv_connect($server, ['Database' => $database, 'Encrypt' => true, 'Authentication' => 'ActiveDirectoryMsi', /* ... */])dan mengembalikan sumber daya. Pola percobaan ulangnya sama: tangkap nilai kembalianfalsedarisqlsrv_connect, periksasqlsrv_errors()untuk SQLSTATE, dan beri jeda sebelum mencoba lagi. Untuk contoh yang sudah dikerjakan, lihat Langkah 4: Terhubung dengan tahan lama ke SQL dengan PHP.Fungsi pembantu percobaan ulang membaca
$e->errorInfo[1]yang dijaga olehisset().PDOException::$errorInfodideklarasikan sebagai?arraydan nilai defaultnya adalahnull, sehingga pemeriksaan defensif menggunakan kode driver0sebagai cadangan dan membiarkan prefiks SQLSTATE08menentukan apakah perlu mencoba lagi.
Untuk informasi selengkapnya tentang setiap bagian konfigurasi ini, lihat:
- Opsi koneksi
- Menyambungkan menggunakan autentikasi Microsoft Entra
- Ketahanan koneksi idle
- Menyambungkan ke Microsoft Azure SQL Database
- Dukungan untuk Ketersediaan Tinggi, pemulihan dari bencana
Untuk katalog kesalahan sementara Azure SQL, lihat Memecahkan masalah kesalahan koneksi sementara.
Fitur utama
- Dua API, satu paket driver: Procedural SQLSRV untuk kode SQL Server-first, atau PDO_SQLSRV untuk kode PDO portabel.
- Dukungan platform luas: Berjalan di Windows, Linux, dan macOS dengan versi PHP yang didukung.
-
Koneksi terenkripsi: Koneksi terenkripsi TLS melalui
Encrypt=true, dengan validasi sertifikat server yang dikendalikan olehTrustServerCertificate. - Autentikasi Microsoft Entra ID: Koneksi tanpa kata sandi dengan identitas terkelola, prinsipal layanan, dan alur token akses melalui Microsoft ODBC Driver for SQL Server yang mendasarinya.
- Always Encrypted: Enkripsi sisi klien untuk kolom sensitif, dengan enklave aman opsional untuk operasi di tempat.
-
Ketahanan koneksi: Koneksi idle bawaan mencoba ulang dengan
ConnectRetryCountdanConnectRetryInterval. - Aliran PHP: Membaca dan menulis nilai biner dan karakter besar sebagai aliran daripada memuatnya ke memori.
-
Dukungan tipe data SQL Server kaya: datetimeoffset, parameter bernilai tabel, nvarchar, dan Unicode dengan
PDO::SQLSRV_ENCODING_UTF8.
Get started
| Artikel | Deskripsi |
|---|---|
| Persyaratan sistem | Mendukung versi PHP, sistem operasi, dan SQL Server. |
| Matriks dukungan | Matriks kompatibilitas rinci untuk rilis driver PHP. |
| Unduh Driver Microsoft untuk PHP untuk SQL Server | Tautan unduhan dan rilis artefak. |
| Tutorial instalasi untuk Linux dan macOS | Instal driver dan prasyarat ODBC-nya di Linux dan macOS. |
| Memuat driver | Aktifkan ekstensi di php.ini. |
| Memulai dengan driver PHP SQL | Panduan menyeluruh yang menggabungkan keempat langkah memulai. |
| Gambaran umum driver SQL PHP | Apa saja yang ada dalam paket, dan kapan memilih SQLSRV atau PDO_SQLSRV. |
Mengonfigurasi dan menyambungkan
| Artikel | Deskripsi |
|---|---|
| Menghubungkan ke server | Buka koneksi ke instance SQL Server dari PHP. |
| Opsi koneksi | Referensi lengkap untuk kata kunci koneksi, default, dan cara mengaturnya. |
| Menyambungkan ke Microsoft Azure SQL Database | Hubungkan aplikasi PHP ke Azure SQL Database. |
| Hubungkan pada port tertentu | Tentukan port TCP non-default. |
| Pengumpulan koneksi | Gunakan kembali koneksi ODBC di seluruh permintaan PHP. |
| Nonaktifkan Beberapa Set Hasil Aktif (MARS) | Matikan MARS untuk kompatibilitas. |
| Dukungan untuk LocalDB | Hubungkan ke instance SQL Server LocalDB. |
| Dukungan untuk High Availability, pemulihan dari bencana | Pendengar grup ketersediaan dan failover multi-subnet. |
| Ketahanan koneksi idle | Penyambungan ulang otomatis pada koneksi idle yang terputus. |
Authenticate
| Artikel | Deskripsi |
|---|---|
| Menyambungkan menggunakan autentikasi Microsoft Entra | Identitas terkelola, prinsipal layanan, token akses, dan alur kata sandi. |
| Terhubung menggunakan autentikasi SQL Server | Gunakan login SQL dengan nama pengguna dan kata sandi. |
| Terhubung menggunakan Windows authentication | Gunakan autentikasi terintegrasi Windows pada host yang tergabung ke domain. |
Secure
| Artikel | Deskripsi |
|---|---|
| Pertimbangan keamanan | Model ancaman dan panduan pertahanan mendalam untuk aplikasi PHP. |
| Selalu Terenkripsi dengan driver PHP | Mengonfigurasi enkripsi sisi klien untuk kolom sensitif. |
| Selalu Terenkripsi dengan enklave yang aman | Aktifkan beragam operasi pada kolom terenkripsi menggunakan enklave aman. |
Ambil dan perbarui data
| Artikel | Deskripsi |
|---|---|
| Panduan pemrograman | Panduan pemrograman end-to-end untuk kedua driver. |
| Membandingkan fungsi eksekusi | Pilih fungsi eksekusi yang tepat untuk beban kerja Anda. |
| Eksekusi pernyataan langsung dan pernyataan yang disiapkan (PDO_SQLSRV) | Kapan menggunakan eksekusi langsung dibandingkan pernyataan yang sudah dipersiapkan. |
| Mengambil data | Ambil baris, kolom, dan nilai yang di-stream. |
| Memperbarui data | Sisipkan, perbarui, dan hapus baris. |
| Lakukan kueri yang diparameterisasi | Ikat parameter untuk mencegah serangan injeksi SQL. |
| Kirim data sebagai aliran | Stream nilai biner dan karakter besar ke SQL Server. |
| Melakukan transaksi | Kelompokkan pernyataan menjadi transaksi atomik. |
| Gunakan parameter bernilai tabel | Teruskan parameter TABLE ke prosedur tersimpan. |
| Tentukan tipe kursor dan pilih baris | Pilih kursor forward-only, statis, dinamis, atau keyset. |
Jenis data
| Artikel | Deskripsi |
|---|---|
| Mengonversi tipe data | Bagaimana driver memetakan tipe PHP ke tipe SQL Server. |
| Tipe data bawaan SQL Server | Tipe SQL Server default untuk setiap nilai PHP. |
| Tipe data bawaan PHP | Tipe PHP default untuk setiap tipe kolom SQL Server. |
| Tentukan tipe data SQL Server (SQLSRV) | Timpa tipe SQL Server saat mengikat parameter. |
| Tentukan tipe data PHP | Timpa tipe PHP ketika mengambil data. |
| Kirim dan ambil data UTF-8 | Gunakan PDO::SQLSRV_ENCODING_UTF8 untuk konversi bolak-balik Unicode. |
| Kirim dan ambil data ASCII di Linux dan macOS | Tangani konversi pulang-pergi ASCII pada host non-Windows. |
| Format desimal dan uang (SQLSRV) | Format kolom desimal dan uang dengan driver SQLSRV. |
| Format desimal dan uang (PDO_SQLSRV) | Format kolom desimal dan uang dengan driver PDO_SQLSRV. |
| Pengaturan lokal non-sistem | Pemisah desimal lokal dan pertimbangan lokal lainnya. |
Kesalahan dan diagnostik
| Artikel | Deskripsi |
|---|---|
| Penanganan kesalahan dan peringatan | Penanganan kesalahan dan peringatan pada kedua driver. |
| Konfigurasikan penanganan kesalahan dan peringatan (SQLSRV) | Sesuaikan bagaimana driver SQLSRV melaporkan kesalahan dan peringatan. |
| Menangani kesalahan dan peringatan (SQLSRV) | Periksa kesalahan yang dikembalikan oleh fungsi SQLSRV. |
| Aktivitas pencatatan | Aktifkan logging driver untuk pengambilan data diagnostik. |
Terapkan dan operasikan
| Artikel | Deskripsi |
|---|---|
| Penyesuaian kinerja | Manajemen koneksi, batching, pernyataan yang disiapkan, kursor, memori, dan pemantauan sisi server. |
| Troubleshooting | Mendiagnosis masalah umum pada instalasi, koneksi, kueri, tipe data, transaksi, dan kontainer. |
Konten referensi
| Artikel | Deskripsi |
|---|---|
| Referensi API driver SQLSRV | Semua sqlsrv_* fungsi, parameter, dan nilai pengembalian. |
| Referensi driver PDO_SQLSRV | Metode PDO dan PDOStatement yang didukung oleh driver PDO_SQLSRV. |
| Konstanta | Konstanta yang diekspos oleh driver, termasuk konstanta tipe dan pengkodean. |
Tugas terkait
| Artikel | Deskripsi |
|---|---|
| Catatan rilis | Riwayat per versi dengan fitur baru, perbaikan bug, perubahan dukungan platform, dan tautan unduhan. |
| Mengenai contoh kode dalam dokumentasi | Konvensi yang digunakan oleh contoh kode di bagian ini. |
| Contoh kode untuk driver SQL PHP | Contoh aplikasi end-to-end untuk SQLSRV dan PDO_SQLSRV. |
| Sumber daya dukungan | Saluran komunitas dan dukungan. |