Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Microsoft Drivers for PHP for SQL Server, PHP betiklerinden Microsoft SQL Database Engine'de veri okumanızı ve yazmanızı sağlayan PHP eklentileridir. Paket, aynı Microsoft ODBC Driver for SQL Server'ı saran ve aynı bağlantı seçeneklerini paylaşan iki sürücü gönderiyor, böylece kod tabanınıza uygun API'yi seçebilirsiniz:
-
SQLSRV, SQL Server özelliklerine uyarlanmış prosedürel bir API (
sqlsrv_*fonksiyonlar) sunar. - PDO_SQLSRV, PHP Veri Nesneleri (PDO) arayüzünü uygular, böylece diğer veritabanları için zaten PDO kullanan kod minimum değişiklikle SQL Server hedefleyebilir.
Her iki sürücü de Azure SQL Veritabanı'e, Microsoft Fabric'teki SQL veritabanı, Azure SQL Yönetilen Örneği'a ve desteklenen tüm SQL Server sürümlerine (Express sürümleri dahil) bağlanır. Büyük ikili ve karakter değerlerini tamamen belleğe yüklemeden aktarmak için PHP akışlarını kullanırlar.
Başlangıç noktanızı seçin
- Bir PHP geliştirme ortamı kurmak ve ilk sorunuzu çalıştırmak için Adım 1: Geliştirme ortamını yapılandırmak, ardından Adım 2: SQL veritabanı oluşturmak ve Adım 3: PHP kullanarak SQL'e bağlanmak için kavram kanıtı.
- Sürücüyü Linux veya macOS'a yüklemek için, Linux ve macOS için Kurulum eğitimi ile başlayın ve SQL Server için PHP için Microsoft Sürücülerini indirin.
- Azure SQL'e şifresiz kimlik doğrulama ile bağlanmak için, Microsoft Entra kimlik doğrulama ve Bağlantı seçenekleriyle Connect ile başlayın.
- Mevcut bir uygulamayı geçici hatalara karşı dayanıklı hale getirmek için Boştaki bağlantı esnekliği ve 4. Adım: PHP ile SQL'e dayanıklı şekilde bağlanma bölümlerine gidin.
- SQLSRV ile PDO_SQLSRV arasında karar vermek için, SQL Server için PHP için Microsoft sürücülerin genel görünümü ve Yürütme fonksiyonlarını karşılaştırma bölümlerine gidin.
- Bir kurulum, bağlantı veya sorgu sorununu teşhis etmek için Sorun Giderme, Hataları ve uyarıları işleme ile Faaliyet Kaydı bölümlerine gidin.
- Mevcut bir uygulamayı daha hızlı hale getirmek için Performance Tuning'e gidin.
Azure SQL için üretim temeli
Bu snippeti, PDO_SQLSRV sürücüsüyle üretim odaklı Azure SQL bağlantı için bir başlangıç noktası olarak kullanın. Sunucu ve veritabanını ortam değişkenlerinden (örneğin Azure App Service uygulama ayarlarından) okur, yönetilen bir kimlik ile kimlik doğrulamasını sağlar, sunucu sertifikası doğrulamasıyla Taşıma Katmanı Güvenliği'ni (TLS) etkinleştirir, soğuk başlatma devre devremesini kapsayan bir giriş zaman aşımını ayarlar ve SQL Server boşta bağlantı dayanıklılığını ayarlar ConnectRetryCountConnectRetryInterval. Uygulama düzeyindeki connectWithRetry ve queryWithRetry yardımçılar, hem ilk bağlantıyı hem de her ifadeyi sınırlı üstel geri dönüşle sarar ve geçici bağlantı hatalarını (yeni bağlantı gerektiren) geçici sorgu hatalarından (aynı bağlantıyı tekrar kullanan) ayırır.
PHP 8.0 ve daha sonraki sürümleri, PDO_SQLSRV uzantısı ve SQL Server 17.3.1.1 ile daha sonraki sürümler Authentication=ActiveDirectoryMsiiçin Microsoft ODBC Sürücüsü gerektirir. Desteklenen Authentication değerlerin tam listesi için bkz. Connect using Microsoft Entra authentication.
<?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;
}
Bu kod parçacığı, Azure SQL Veritabanı yük devretme grupları ve Azure SQL Yönetilen Örneği için ayarlanmıştır.
Driver={ODBC Driver 18 for SQL Server}ODBC 18 sürücüsünü sabitler. Eğer ana bilgisayarda ODBC 17 de yüklüyse, PDO_SQLSRV ODBC 17'ye bağlanabilir. Eski 17.x derlemeleri yeniAuthenticationdeğerleri reddeder; örneğin,Authentication=ActiveDirectoryMsiODBC 17.3.1.1 veya daha sonraki sürümleri gerektirir. Bkz. bağlantı dizesi özniteliği 'Authentication' için belirtilen geçersiz değer.ConnectRetryCountveConnectRetryIntervalSQL Server boşta bağlantı dayanıklılığını sağlayan ODBC bağlantı dizesi anahtar kelimeleridir: sürücü, bozuk bir boşta bağlantıyı şeffaf şekilde yeniden bağlar. Bu, geçici bir hata (örneğin kilitlenme veya sorgu zaman aşımı) nedeniyle başarısız olan bir deyimi yeniden deneyen uygulama düzeyindekiqueryWithRetryyapısından farklıdır. İkisi tamamlayıcı, ikisini de sakla.LoginTimeoutdeğerinin en azConnectRetryCount * ConnectRetryIntervalolduğundan emin olun; böylece boştayken yeniden bağlanma akışı kendisine ayrılan sürenin tamamını kullanabilir. Örnekte, 5 × 15 saniyelik yeniden denemeleri karşılamak ve soğuk yük devretmede ilk oturum açma için ek pay bırakmak üzere 90 saniye kullanılır.Uygulama düzeyindeki
error_log()çağrıları sürücü tarafı tanılamalarla tamamlayın. PDO_SQLSRV için,pdo_sqlsrv.log_severity’ıphp.iniiçinde ayarlayın (yalnızca başlatma sırasında ayarlanabilir); SQLSRV için, çalışma zamanındasqlsrv_configure("LogSubsystems", ...)çağrısını yapın. Daha fazla bilgi için Kayıt faaliyetleri bölümünü inceleyebilirsiniz.; 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 = 1Kullanıcı tarafından atanan bir yönetilen kimlik için, kimliğin kimlik numarasını PDO'nun
$usernameargümanı olarak (new PDO($dsn, $identityId, null, $options)) iletin. istemci kimliğiniAzure App Service veya Azure Container Instance üzerinde kullanın; aksi takdirde nesne kimliğini kullanın. PHP sürücüleri bu davranışı altta yatan Microsoft ODBC Driver for SQL Server'dan miras alır; daha fazla bilgi için bkz. ODBC Sürücüsü ile Microsoft Entra ID'nin Kullanılması. PDO_SQLSRV, DSN’nin kendi içindeUIDifadesini kabul etmez; bu nedenle oluşturucu parametresini kullanın. Kullanıcı olaraknulldeğerini geçirmek (örnekte yapıldığı gibi), Azure ana bilgisayarının sistem tarafından atanan yönetilen kimliğini seçer. SQLSRV (yordamsal) için, bağlantı seçenekleri dizisindeUIDgeçirin.Yük devretme grubu dinleyicisine, kullanılabilirlik grubu dinleyicisine veya yük devretme kümesi örneği uç noktasına bağlandığınızda
MultiSubnetFailover=trueolarak ayarlayın. Bu ayar, hem tek alt ağ hem de çoklu alt ağ erişilebilirlik grubu dinleyicileri için bağlantı performansını artırır. Daha fazla bilgi için Yüksek Erişilebilirlik Desteği, felaket kurtarma bölümlerine bakınız.Okuma ölçek genişletmesi veya okunabilir bir ikincil için, Veri Kaynağı Adına (DSN)
ApplicationIntent=ReadOnlyekleyin.Sertifikanın Subject Alternative Name (SAN) alanı bağlandığınız ana bilgisayarı içermediği egemen bulutlarda,
HostNameInCertificateöğesini DSN'ye ekleyin (örneğin, Azure Kamu için*.database.usgovcloudapi.net).Sürücü, token edinimi için Microsoft ODBC Driver for SQL Server'a dayanır. Yönetilen kimlik, hizmet prensibi ve erişim token akışları hepsi ODBC üzerinden geçer. Daha fazla bilgi için ODBC Sürücüsü ile Microsoft Entra ID'yi kullanma konusuna bakın.
Daha yüksek güvenlik ve ortamlar arasında taşınabilirlik için, bağlantı bilgilerini kodunuzun dışında tutun. Bağlantı bilgilerini uygulamanızın yapılandırma sisteminde saklayın ve hassas değerler ile merkezi yönetilen bağlantı ayarları için Azure Key Vault'u kullanın.
Eşdeğer SQLSRV bağlantısı
sqlsrv_connect($server, ['Database' => $database, 'Encrypt' => true, 'Authentication' => 'ActiveDirectoryMsi', /* ... */])kullanır ve bir kaynağı döndürür. Yeniden deneme düzeni aynıdır:sqlsrv_connect'den gelenfalsedönüşünü yakalayın, SQLSTATE içinsqlsrv_errors()'yi inceleyin ve yeniden denemeden önce bir süre bekleyin. Uygulamalı bir örnek için bkz: Adım 4: PHP ile SQL'e Dayanıklı Bir Şekilde Bağlanma.Yeniden deneme yardımcıları,
isset()tarafından korunan$e->errorInfo[1]’ı okur.PDOException::$errorInfo,?arrayolarak bildirilir ve varsayılan değer olaraknullkullanılır; bu nedenle koruyucu denetim0sürücü koduna geri döner ve yeniden deneme yapılıp yapılmayacağını SQLSTATE08önekinin belirlemesine olanak tanır.
Bu yapılandırmanın her bölümü hakkında daha fazla bilgi için bkz:
- Bağlantı seçenekleri
- Microsoft Entra kimlik doğrulamayı kullanarak bağlanma
- Boşta bağlantı dayanıklılığı
- Microsoft Azure SQL Veritabanı'na bağlanma
- Yüksek Kullanılabilirlik Desteği, felaket kurtarma
Azure SQL geçici hataların kataloğu için bkz. Geçici bağlantı hatalarını giderme.
Temel özellikler
- İki API, bir sürücü paketi: SQL Server-ilk kod için prosedürel SQLSRV veya taşınabilir PDO kodu için PDO_SQLSRV.
- Geniş platform desteği: Windows, Linux ve macOS ile desteklenen PHP sürümleriyle çalışır.
-
Şifreli bağlantılar: TLS ile şifrelenmiş bağlantılar,
Encrypt=truesunucu sertifikası doğrulaması ile kontrol edilirTrustServerCertificate. - Microsoft Entra ID kimlik doğrulaması: Altta yatan Microsoft ODBC Driver for SQL Server üzerinden, yönetilen kimlik, hizmet sorumlusu ve erişim belirteci akışlarıyla şifresiz bağlantılar.
- Always Encrypted: Hassas sütunlar için istemci tarafı şifreleme; yerinde işlemler için isteğe bağlı güvenli enklavlarla.
-
Bağlantı dayanıklılığı:
ConnectRetryCountveConnectRetryIntervalile boşta kalan bağlantılar için yerleşik yeniden deneme. - PHP akışları: Büyük ikili ve karakter verilerini belleğe yüklemek yerine akışlar olarak okuyun ve yazın.
-
Zengin SQL Server veri türü desteği: datetimeoffset, tablo değerli parametreler, nvarchar ve
PDO::SQLSRV_ENCODING_UTF8ile Unicode.
Get started
| Makale | Description |
|---|---|
| Sistem gereksinimleri | PHP, işletim sistemi ve SQL Server sürümlerini destekledi. |
| Destek matrisi | PHP sürücü sürümleri için ayrıntılı uyumluluk matrisi. |
| SQL Server için PHP için Microsoft Sürücülerini indirin | Bağlantıları indirin ve eserleri yayınlayın. |
| Linux ve macOS için kurulum eğitimi | Sürücüyü ve ODBC ön koşullarını Linux ve macOS'a yükleyin. |
| Sürücülerin yüklenmesi | Genişletmeleri php.ini içinde etkinleştirin. |
| PHP SQL sürücüsüyle başlama | Dört başlangıç adımını birbirine bağlayan uçtan uca bir rehber. |
| PHP SQL sürücüsüne genel bakış | Pakette ne var ve ne zaman SQLSRV veya PDO_SQLSRV seçilmeli. |
Yapılandırma ve bağlanma
| Makale | Description |
|---|---|
| Sunucuya bağlanma | PHP'den bir SQL Server örneğine bağlantı açın. |
| Bağlantı seçenekleri | Bağlantı anahtar sözcükleri, varsayılanlar ve bunların nasıl ayarlanacağına ilişkin tam referans. |
| Microsoft Azure SQL Veritabanı'na bağlanma | Bir PHP uygulamasını Azure SQL Veritabanı'e bağlayın. |
| Belirli bir porta bağlanın | Varsayılan olmayan bir TCP portunu hedefleyin. |
| Bağlantı havuzu oluşturma | PHP istekleri arasında ODBC bağlantılarını tekrar kullanın. |
| Birden Fazla Aktif Sonuç Setini (MARS) Devre Dışı Bırak | Uyumluluk için MARS'ı kapatın. |
| LocalDB desteği | Bir SQL Server LocalDB örneğine bağlanın. |
| Yüksek Kullanılabilirlik Desteği, felaket kurtarma | Kullanılabilirlik grubu dinleyicileri ve çoklu alt ağ yük devretmesi. |
| Boşta bağlantı dayanıklılığı | Bozulan boşta bağlantılar için otomatik yeniden bağlanma. |
Authenticate
| Makale | Description |
|---|---|
| Microsoft Entra kimlik doğrulamayı kullanarak bağlanma | Yönetilen kimlik, hizmet prensibi, erişim tokenı ve şifre akışları. |
| SQL Server kimlik doğrulaması ile bağlanın | SQL girişini kullanıcı adı ve şifre ile kullanın. |
| Windows authentication ile bağlanın | Alan bağlantısı olan ana bilgisayarlarda Windows entegre kimlik doğrulaması kullanın. |
Secure
| Makale | Description |
|---|---|
| Güvenlikle ilgili dikkat edilmesi gerekenler | PHP uygulamaları için tehdit modeli ve derinlemesine savunma rehberi. |
| Her Zaman PHP sürücüleriyle şifrelenmiştir | Hassas sütunlar için istemci tarafı şifrelemesini yapılandırın. |
| Her Zaman Şifreli ile güvenli enklavlar | Güvenli enklavlarla şifrelenmiş sütunlarda gelişmiş işlemleri mümkün kılın. |
Veri alma ve güncelleme
| Makale | Description |
|---|---|
| Program rehberi | Her iki sürücü için uçtan uca programlama rehberi. |
| Yürütme fonksiyonlarının karşılaştırılması | İş yükünüz için doğru yürütme fonksiyonunu seçin. |
| Doğrudan ve hazırlanmış ifade yürütme (PDO_SQLSRV) | Doğrudan yürütme yerine hazırlanmış ifadeler ne zaman kullanılacak? |
| Veriler alınıyor | Satırları, sütunları ve akış verilerini getirme. |
| Verilerin güncellenmesi | Satır ekle, güncelle ve sil. |
| Parametrizlenmiş sorgular gerçekleştirin | SQL enjeksiyonuna karşı korumak için parametreleri bağlayın. |
| Veri akışı olarak gönder | Büyük ikili ve karakter değerlerini SQL Server’a aktarın. |
| İşlemler yapma | İfadeleri atomik işlemler halinde grupla. |
| Tablo değerli parametreleri kullanın | Bir TABLE parametreyi depolanmış bir prosedüre ilet. |
| Bir imleç tipi belirtin ve satır seçin | Sadece ileri yönlü, statik, dinamik veya tuş seti imleci seçin. |
Veri türleri
| Makale | Description |
|---|---|
| Veri türlerinin dönüştürülmesi | Sürücünün PHP tiplerini SQL Server tiplerine nasıl eşlediği. |
| Varsayılan SQL Server veri türleri | Her PHP değeri için varsayılan SQL Server türü. |
| Varsayılan PHP veri türleri | Her SQL Server sütun tipi için varsayılan PHP tipi. |
| SQL Server veri türlerini belirt (SQLSRV) | Parametreleri bağlamarken SQL Server tipini geçersiz kılın. |
| PHP veri tiplerini belirt | Getirme sırasında PHP tipini geçersiz kıl. |
| UTF-8 verilerini gönder ve geri getir | Unicode gidiş-dönüşleri için PDO::SQLSRV_ENCODING_UTF8 kullanın. |
| Linux ve macOS'ta ASCII verilerini gönderin ve alın | Windows olmayan ana bilgisayarlarda ASCII gidiş-dönüş işlemlerini yönetin. |
| Ondalık sayıları ve para birimini biçimlendirme (SQLSRV) | SQLSRV sürücüsüyle ondalık ve para sütunlarını biçimlendirin. |
| Ondalık sayıları ve para birimlerini biçimlendirme (PDO_SQLSRV) | PDO_SQLSRV sürücüsünü kullanarak ondalık ve para sütunlarını biçimlendirin. |
| Sistem dışı yerel ayarlar | Yerel ondalık ayırıcılar ve diğer yerel değerlendirmeler. |
Hatalar ve tanılamalar
| Makale | Description |
|---|---|
| Hata ve uyarıların işlenmesi | Her iki sürücüde de hata ve uyarı yönetimi var. |
| Hata ve uyarı işlemeyi yapılandırma (SQLSRV) | SQLSRV sürücüsünün hata ve uyarıları nasıl bildirdiğini ayarlayın. |
| Hataları ve uyarıları ele alın (SQLSRV) | SQLSRV fonksiyonları tarafından döndürülen hataları inceleyin. |
| Günlük kaydı etkinliği | Tanılama verilerini yakalamak için sürücü günlüğünü etkinleştirin. |
Dağıtım ve işletim
| Makale | Description |
|---|---|
| Performans ayarlama | Bağlantı yönetimi, toplu çalışma, hazırlanmış ifadeler, imleçler, bellek ve sunucu tarafı izleme. |
| Troubleshooting | Yaygın kurulum, bağlantı, sorgu, veri türü, işlem ve konteyner sorunlarını teşhis edin. |
Referans içeriği
| Makale | Description |
|---|---|
| SQLSRV sürücü API referansı | Tüm sqlsrv_* fonksiyonlar, parametreler ve döndürme değerleri. |
| PDO_SQLSRV sürücü referansı | PDO ve PDOStatement yöntemleri PDO_SQLSRV sürücüsü tarafından desteklenir. |
| Sabitleri | Sürücüler tarafından ortaya çıkan sabitler, tip ve kodlama sabitleri dahil. |
İlgili görevler
| Makale | Description |
|---|---|
| Sürüm notları | Yeni özellikler, hata düzeltmeleri, platform desteğindeki değişiklikler ve indirme bağlantılarını içeren sürümlere göre geçmiş. |
| Dokümantasyondaki kod örnekleri hakkında | Bu bölümdeki kod örnekleri tarafından kullanılan konvansiyonlar. |
| PHP SQL sürücüsü için kod örnekleri | SQLSRV ve PDO_SQLSRV için uçtan uca örnek uygulamalar. |
| Destek kaynakları | Topluluk ve destek kanalları. |
İlgili içerik
- Microsoft Drivers for PHP for SQL Server on GitHub
- SQL Server için Microsoft ODBC Sürücüsü
- Microsoft SQL Veritabanı için
Bağlantı modülleri