Статьи

Что означает SQL Server 2012 для разработчиков PHP

На прошлой неделе Microsoft провела виртуальную конференцию, чтобы объявить о доступности SQL Server 2012. Конференция включала ряд мероприятий (докладчики, видео, учебные мероприятия и т. Д.), Посвященных новым функциям, доступным в этом выпуске . Теперь, когда большая часть фанфар немного утихла, я хотел бы взглянуть на то, что значат некоторые из этих новых функций для разработчиков PHP. Я думаю, что в сочетании с выпуском Microsoft Driver for SQL Server для PHP , выпуск SQL Server 2012 внес несколько значительных улучшений в разработку приложений PHP / SQL Server.

Более простая настройка среды разработки

Если вы использовали SQL Server Express в прошлом, вы, возможно, не были в восторге во время загрузки, установки и настройки сервера базы данных. С введением SQL Server Express LocalDB это можно сделать менее чем за 5 минут . Вот как:

1. Загрузите SQL Server Express LocalDB . Выберите ENU \ x64 \ SqlLocalDB.MSI или ENU \ x86 \ SqlLocalDB.MSI в зависимости от архитектуры вашего компьютера.

2. Загрузите инструменты командной строки . Найдите « Утилиты командной строки Microsoft® SQL Server® 2012 » и выберите загрузку для архитектуры своего компьютера.

Выполнив эти два шага, вы можете подключиться к LocalDB и начать создавать базы данных с помощью утилиты sqlcmd :

образ

Существует также утилита SqlLocalDB, которая позволяет создавать и управлять экземпляром SQL Server Express LocalDB.

3. Загрузите драйверы Microsoft для SQL Server для PHP . Добавьте драйвер в каталог расширений PHP и включите его в файле php.ini , и вы можете подключиться к нему следующим образом:

    $serverName = '(localdb)\v11.0';
    $connOptions = array('AttachDBFileName'=>'C:\Users\bswan\ExampleDB.mdf','Database'=>'ExampleDB');
     
    $conn = sqlsrv_connect($serverName, $connOptions);
    if($conn === false)      
        die(print_r(sqlsrv_errors(), true)); 
    else
        echo "Connected via sqlsrv!<br />";

Вот и все. С нуля писать запросы к базе данных SQL Server на PHP гораздо быстрее, чем раньше.

Конечно, это не совсем так. Может быть несколько ошибок, и может быть еще пара шагов, в зависимости от того, что вы хотите сделать. Вот несколько вещей, с которыми я столкнулся при настройке:

  • Если вы устанавливаете LocalDB и инструменты командной строки на компьютере, на котором установлена ​​предыдущая версия SQL Server, вам нужно будет изменить переменную среды PATH. Вам нужно будет двигаться как C: \ Program Files \ Microsoft SQL Server \ 110 \ Tools \ Binn \ и C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ пути перед любыми другими путями к SQL Серверные инструменты (по умолчанию они, вероятно, будут в конце переменной PATH — порядок соответствует порядку установки). Это гарантирует, что при использовании sqlcmd будет вызвана правильная версия.
  • Обратите внимание, что в моем PHP-коде я указываю абсолютный путь к файлу .mdf. Вы должны предоставить абсолютный путь. По умолчанию утилита sqlcmd создает файлы .mdf в каталоге User. Однако вы можете использовать любой файл .mdf, который у вас есть … просто укажите абсолютный путь к нему (и убедитесь, что утилита sqlcmd имеет доступ к каталогу). Помните, что если файл .mdf был создан с предыдущей версией SQL Server, он будет обновлен при первом подключении к нему (что приведет к целому ряду предупреждений). После обновления все должно работать без сбоев.
  • Также обратите внимание, что в моем PHP-коде я подключаюсь с использованием аутентификации Windows (я опустил элементы UID и PWD из массива параметров подключения). При использовании LocalDB вы можете подключиться только с проверкой подлинности Windows. И, если вы используете IIS, для входа в систему используются учетные данные пула приложений для PHP. Итак, поскольку здесь мы говорим о среде разработки, я предлагаю установить учетные данные пула приложений в идентичность, которая также является логином для целевой базы данных. Я сделал это, запустив IIS Manager, щелкнув «Пулы приложений», щелкнув правой кнопкой мыши DefaultAppPool (в моем случае PHP работает под этим пулом), а затем выполнив следующие действия:

образ

Дружественный синтаксис: OFFSET… FETCH NEXT

Я написал несколько статей о стратегиях подкачки данных с помощью драйвера SQL Server для PHP, причем все они основывались на синтаксисе ROW_NUMBER… OVER или серверных курсорах . Синтаксис ROW_NUMBER… OVER громоздок по сравнению с синтаксисом MySQL LIMIT… OFFSET, а серверные курсоры подходят не для всех сценариев. Введите синтаксис OFFSET… FETCH NEXT в SQL Server 2012. Теперь легко получить именно тот набор данных, который вам нужен, из гораздо большего набора:

    $sql = "SELECT Name, ProductNumber 
            FROM Production.Product
            ORDER BY ProductNumber
            OFFSET ? ROWS
            FETCH NEXT ? ROWS ONLY";
     
    $params = array((int) $_GET['low'], (int) $_GET['high']);    
     
    $stmt = sqlsrv_query($conn, $sql, $params);

 

Больше гибкости: клиентские курсоры

До выпуска v3.0 драйвера PHP единственными доступными опциями для перемещения по результирующему набору были «только вперед» (по умолчанию, что заставляет вас использовать строки по порядку, и вы не можете вернуться к предыдущему строк) или использовать серверные курсоры (которые, как упоминалось ранее, не идеальны для всех сценариев). Однако в версии 3.0 доступны клиентские курсоры для произвольного доступа к строкам набора результатов. Чтобы включить это, установите для параметра Scrollable значение buffered в sqlsrv_query или sqlsrv_prepare :

    $sql = "SELECT Name, ProductNumber 
            FROM Production.Product";
     
    $stmt = sqlsrv_query($conn, $sql, null, array("Scrollable"=>"buffered"));
    if($stmt === false)
        die(print_r(sqlsrv_errors(), true));

С включенными клиентскими запросами (то есть «буферизованными» запросами) вы можете использовать функцию sqlsrv_num_rows для получения количества строк, и вы можете использовать следующие константы с sqlsrv_fetch, sqlsrv_fetch_array или sqlsrv_fetch_object для случайного доступа к строкам:

  • SQLSRV_SCROLL_NEXT
  • SQLSRV_SCROLL_PRIOR
  • SQLSRV_SCROLL_FIRST
  • SQLSRV_SCROLL_LAST
  • SQLSRV_SCROLL_ABSOLUTE
  • SQLSRV_SCROLL_RELATIVE

Просто для забавы, вот один способ, которым вы можете использовать эти константы для работы в обратном направлении через набор результатов:

    $num_rows = sqlsrv_num_rows($stmt);
    for($i = $num_rows - 1; $i >= 0; $i--)
    {
        $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, $i);
        // process row here
    }

Конечно, вы также можете использовать клиентские курсоры с расширением PDO. В документации множество примеров .

Есть еще кое-что

Упомянутые выше улучшения — это те, которые, на мой взгляд, имеют наибольшее влияние на разработчиков PHP. Но есть и другие вещи, которые могут вас заинтересовать, например, поддержка подключения AlwaysOn и константы PDO :: ATTR_EMULATE_PREPARES в драйвере PHP. Кроме того, драйвер PHP по-прежнему обеспечивает доступ к SQL Azure , драйвер ODBC для SQL Server для Linux находится в бета-выпуске (которым уже пользуются некоторые разработчики PHP ), и Hadoop для Azure уже в пути. Единственное замечание в этом выпуске — драйвер PHP в настоящее время не поддерживает PHP 5.4, но это временная вещь. Я знаю, что команда работает над тем, чтобы быстро добавить эту поддержку.

Как я упоминал в начале, я думаю, что выпуск SQL Server 2012 делает несколько больших шагов в направлении улучшения опыта разработки для разработчиков PHP. Спасибо всем, кто предоставил нам обратную связь, чтобы помочь нам здесь … мы слушали. Мне было бы очень интересно услышать, если вы согласны.