【问题标题】:Azure: How to correctly use a PHP webjob to make changes to SQL database?Azure:如何正确使用 PHP webjob 来更改 SQL 数据库?
【发布时间】:2016-09-11 01:10:35
【问题描述】:

目标:使用 PHP webjob 连接和更改 Azure 中的 SQL 数据库表。

我正在尝试将包含 .php.json 文件的 .zip 文件上传到我在 Azure 上运行的应用服务内的 webjobs 设置。

我认为我在 PHP 文件中编码 PDO-SQL 连接的方式有问题,当我将 webjob 作为.zip 上传到 webjobs 时,状态始终为“等待重新启动”。

这是我的 .php 文件中的内容:

<?php

$conn = new PDO ( "sqlsrv:server = mydb.database.windows.net,1433; Database = myappservices");
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
catch ( PDOException $e ) {
  print( "Error connecting to SQL Server." );
}
$connectionInfo = array("Database" => "myappservices");
$serverName = "mydb.database.windows.net,1433";
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn) {
  $stf = $conn->prepare("INSERT INTO MyTable
                        VALUES ('boom', 1, 2);");
  $stf->execute();
}

?>

那么我的.json 文件只是一个调度器:

{
    "schedule": "0 */5 * * * *"
}

这是我要上传的.zip 文件中仅有的两个文件。

为了解释 PHP 代码,我尝试通过 Windows 身份验证进行连接(无需用户/密码)。也许我也做错了。

谁有办法做到这一点?对于如何更改我的代码以使该网络作业实际运行,我非常感谢您提供一步一步的建议或建议。

【问题讨论】:

    标签: php sql azure azure-webjobs webjob


    【解决方案1】:

    考虑一下这个job.php

    <?php
    
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    
    try {
        // DON'T HARDCODE CREDENTIALS, pull from Application Settings.
        // In Azure App Service, Application Settings are exposed as
        // environment variables.
        //
        // i.e. $db_user = getenv("DB_USER");
        //
        $conn = new PDO ("sqlsrv:server = poqfsXXXX.database.windows.net,1433;
                         Database = MobileApp_db",
                         "Username", "P@ssw0rd");
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch (PDOException $e) {
        print("Error connecting to SQL Server: " + $e);
    }
    
    $stmt = $conn->prepare("select * from todoitems");
    $stmt->execute();
    while ($row = $stmt->fetch()) {
        print_r($row);
    }
    
    unset($conn);
    unset($stmt);
    
    ?>    
    

    预期输出:
    (你可以在 Kudu 中测试:https://{sitename}.scm.azurewebsites.net/DebugConsole

    d:\home\site\tests> "d:\program files (x86)\php\v5.6\php.exe" job.php
    
    Array
    (
        [Id] => d4657cff-09a2-4a8a-b1d2-462c2c42a9f0
        [0] => d4657cff-09a2-4a8a-b1d2-462c2c42a9f0
        [Text] => From Azure SQL
        [1] => From Azure SQL
        [Complete] => 0
        [2] => 0
        [Version] => 0000000000001825
        [3] => 0000000000001825
        [CreatedAt] => 2016-06-17 10:11:17.1167267 +00:00
        [4] => 2016-06-17 10:11:17.1167267 +00:00
        [UpdatedAt] => 2016-06-17 10:11:17.1167267 +00:00
        [5] => 2016-06-17 10:11:17.1167267 +00:00
        [Deleted] => 0
        [6] => 0
    )
    Array
    (
        ...
    )
    ...
    

    为了解释 PHP 代码,我尝试通过 Windows 身份验证进行连接(无需用户/密码)。也许我也做错了。

    虽然 Azure SQL 确实支持 Windows 身份验证,但我不确定您所说的“不需要用户/密码”是什么意思。 Windows 身份验证意味着“获取运行此进程的任何人的凭据并尝试针对 SQL 服务器进行身份验证”。由于您以沙盒提供的随机用户身份运行 Webjob,因此 Windows 身份验证没有多大意义。

    来自 Kudu 的 Process Explorer:

    这是使用 Azure SQL 进行 Windows 身份验证的一种有效方案:

    您有一个本地托管应用程序,该应用程序使用 Active Directory 对您的本地 SQL Server 进行身份验证。你需要迁移到 Azure SQL。您无法更改 SQL 的身份验证方法。因此,您将目录dirsync 到 Azure AD 并使用 Windows 身份验证连接到 Azure SQL。

    有关 Azure SQL 中的 Windows 身份验证的更多信息:
    https://azure.microsoft.com/en-us/documentation/articles/sql-database-aad-authentication/

    【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多