PHP 的 SSRS SDK:从 PHP 5.5 开始不工作

SSRS SDK For PHP : Not working from PHP 5.5

我正在使用 SSRS SDK For PHP,令人惊讶的是,它多年来一直没有更新 (08.04.2010)。 它在 PHP 5.4 (5.4.44) 下工作正常,但在 5.5+ (5.5.37, 5.6.28, 7.x)

下不能正常工作

错误是:

array ( )Failed to connect to Reporting Service Make sure that the url (https://myHost:60004/ReportServer/) and credentials are correct!

第 207 行抛出异常,因为 var $content 等于 FALSE(因此无法加载内容)。

PHP 5.4.44 完全没问题。

我找不到关于 PHP 版本支持的 "SSRS SDK For PHP" 文档...

我没有使用任何框架,例如 Symfony2、CakePHP、Zend Framework... 除了 Bootstrap。

有没有人知道或解决了这个问题?

编辑

正如评论中所问,这是我的代码:

function buildSSRSReport($companyId)
    {
        require_once '../tools/SSRSReport/SSRSReport.php';

        try {
            // Create a connection to the SSRS Server
            $rs = new SSRSReport(new Credentials(SSRS_USER_ID, SSRS_PASSWORD), SSRS_REPORT_SERVER_URL);
            $sqlConnection = self::getSqlConnection();

            // Load the report and specify the params required for its execution
            $executionInfo = $rs->LoadReport2(self::getSSRSEnvironment(), NULL);
            $parameters = array();
            $parameters[0] = new ParameterValue();
            $parameters[0]->Name = "CompanyId";
            $parameters[0]->Value = $companyId;
            $rs->SetExecutionParameters2($parameters);

            // Require the Report to be rendered in HTML format
            $renderAsHTML = new RenderAsPDF();

            // Set the links in the reports to point to the php app
            //$renderAsHTML->ReplacementRoot = getPageURL();

            // Set the root path on the server for any image included in the report
            //$renderAsHTML->StreamRoot = './images/';

            // Execute the Report
            $result_html = $rs->Render2($renderAsHTML,
                PageCountModeEnum::$Actual,
                $Extension,
                $MimeType,
                $Encoding,
                $Warnings,
                $StreamIds);

            $pdfFileName = self::getCompanyAlias($sqlConnection, $companyId) . ".pdf";

            header('Content-Type: application/x-download');
            header('Content-Disposition: attachment; filename="' . $pdfFileName . '"');
            header('Cache-Control: private, max-age=0, must-revalidate');
            header('Pragma: public');

            return $result_html;
        } catch (SSRSReportException $serviceException) {
            echo $serviceException->GetErrorMessage();
        }

    }

    function getSSRSEnvironment()
    {
        return "/DEV/CompanyESGReportingServices-DEV/Main";
    }

    private function getSqlConnection()
    {
        require_once("../inc/eth_connexion.php");
        /* These 4 variables are contained within the eth_connexion.php file */
        $serverName = SQL_SERVERNAME;
        $userName = SQL_USERNAME;
        $dbName = SQL_DATABASENAME;
        $password = SQL_PASSWORD;

        // SQLSRV : Connection array used when calling SQL via sqlsrv_query
        $connectionInfo = array("Database"=> SQL_DATABASENAME,
            "UID"=> SQL_USERNAME,
            "PWD"=> SQL_PASSWORD,
            "ReturnDatesAsStrings" => true);

        $sqlConnection = sqlsrv_connect($serverName, $connectionInfo);
        if (!$sqlConnection) {
            die('Can't log to the database');
        }

        return $sqlConnection;
    }

这里是 SSRSReport 构造函数的源代码(原始来自 PHP 的 SSRS SDK):

public function SSRSReport($credentials, $url, $proxy = null)
{        
    $this->_BaseUrl = ($url[strlen($url) - 1] == '/')? $url : $url . '/';
    $executionServiceUrl = $this->_BaseUrl . self::ExecutionService;
    $managementServiceUrl = $this->_BaseUrl . self::ManagementService;

    $options = $credentials->getCredentails();
    $stream_conext_params = array( 'http' =>
                                     array('header' =>
                                      array($credentials->getBase64Auth())));
    if(isset($proxy))
    {
        $options = array_merge($options, $proxy->getProxy());
        $stream_conext_params['http']['proxy'] = 'tcp://' .
                                                    $proxy->getHost() .
                                                    ':' .
                                                    $proxy->getPort();
        if($proxy->getLogin() != null)
        {               
            $stream_conext_params['http']['header'][1] = $proxy->getBase64Auth();
        }            
    }

    /**
     * If the SoapClient call fails, we cannot catch exception or supress warning
     * since it throws php fatal exception.
     * http://bugs.php.net/bug.php?id=34657
     * So try to load the wsdl by
     * calling file_get_contents (with warning supressed i.e. using @ symbol
     * infront of the function call)
     * 
     */
    $context = stream_context_create($stream_conext_params);
    $content = @file_get_contents($executionServiceUrl, false, $context);
    if ($content === FALSE) // I'M GOING HERE WITH PHP 5.5+ 
    {
        throw new SSRSReportException("",
                    "Failed to connect to Reporting Service  <br/> Make sure " .
                    "that the url ($this->_BaseUrl) and credentials are correct!");
    }

    $this->_soapHandle_Exe =  new SoapClient ($executionServiceUrl, $options);
    $this->_soapHandle_Mgt =  new SoapClient ($managementServiceUrl, $options);
    $this->ClearRequest();
}

确切的错误信息是:

https://myPublicHostProvider:60004/ReportServer/ReportExecution2005.asmx?wsdl Authorization: Basic = array(1) { ["http"]=> array(1) { ["header"]=> array(1) { [0]=> string(57) "Authorization: Basic =" } } } Failed to connect to Reporting Service Make sure that the url (https://myPublicHostProvider:60004/ReportServer/) and credentials are correct!

SSRS SDK for PHP Configuration Pointers

  • 确保您的报表服务器实例可以访问。通过访问 Web 门户或服务 URL.

  • 对其进行测试
  • 提供您的凭据。如果您已通过身份验证,则您使用的凭据有效。

  • 之后,进入目录\Program Files\Microsoft SQL Server\<INSTANCE_NAME>\Reporting Services\ReportServer,寻找名为rsreportserver.config

  • 的文件
  • 找到这个片段

    <Authentication>
    <AuthenticationTypes>
        <RSWindowsNTLM/>
    </AuthenticationTypes>
    <Authentication>
    
  • <RSWindowsNTLM/> 条目下方添加 <RSWindowsBasic/>

For your reference, this was the snippet I used to test my instance during configuration.

require_once( 'SSRSReport\bin\SSRSReport.php' );

define( 'UID', 'DOMAIN\Username' );
define( 'PASWD', 'Password' );
define( 'SERVICE_URL', 'http://127.0.0.1/SERVICE_URL/' );

try {
    $ssrs_report = new SSRSReport( new Credentials( UID, PASWD ), SERVICE_URL );
    $ssrs_report->LoadReport2( '/test', NULL );
    $renderAsHTML = new RenderAsHTML();
    $result_html = $ssrs_report->Render2(
        $renderAsHTML,
        PageCountModeEnum::$Estimate,
        $Extension,
        $MimeType,
        $Encoding,
        $Warnings,
        $StreamIds
    );
    echo $result_html;  
} catch ( SSRSReportException $serviceException ) {
    echo $serviceException->GetErrorMessage();
}

可以成功加载位于加载路径上的RDL。

感谢您的帮助 MiSAKACHi。它为我指明了正确的方向。实际上,我在我无权访问的托管服务提供商上使用远程专用服务器。但是 <RSWindowsBasic/> 在那里,因为它可以使用 PHP 5.4 加载报告。在这个版本下一切正常。

感谢您,我发现了问题:我正在使用 HTTPS,使用 HTTPS 时它不起作用,而当我使用 HTTP 时它起作用! 我正在咨询我的托管服务提供商是否可以做些什么。

编辑 - 解决方案

我的托管服务提供商去年解决了这个问题(忘了 post 这里)。在它没有修复的那段时间里,我还在 PHP 5.4 下。 我粘贴他们的原始消息:

These issues that you describe is because the installed Certificate is a self signed Certificate. New Web Browsers and PHP Version don't accept these Certificates because of Security Risks.

We have changed the Certificate with a official issued Certificate

我只想补充一点,我在使用 codeplex ssrsphp, therefore I googled and found another sdk, which works perfectly. I'm using php 7+. Here 是 link 时遇到了问题,如果有任何与此相关的问题,我可以随时联系。