0

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

错误是:

数组 ( ) 连接报告服务失败 请确保 url ( https://myHost:60004/ReportServer/ ) 和凭据正确!

在第 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 构造函数的源代码(来自 SSRS SDK For PHP):

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)
     * http://stackoverflow.com/questions/272361/how-can-i-handle-the-warning-of-filegetcontents-function-in-php
     */
    $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 授权:基本 = array(1) { ["http"]=> array(1) { ["header"]=> array(1) { [0 ]=> string(57) "Authorization: Basic =" } } } 无法连接到 Reporting Service 确保 url ( https://myPublicHostProvider:60004/ReportServer/ ) 和凭据正确!

4

3 回答 3

0

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

多亏了你,我发现了问题:我使用的是 HTTPS,而使用 HTTPS 时它不起作用,而当我使用 HTTP 时它起作用!我正在与我的托管服务提供商核实他们是否可以做些什么。

编辑 - 解决方案

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

您描述的这些问题是因为安装的证书是自签名证书。由于安全风险,新的 Web 浏览器和 PHP 版本不接受这些证书。

我们已将证书更改为官方颁发的证书

于 2017-04-25T06:40:47.680 回答
0

用于 PHP 配置指针的 SSRS SDK

  • 确保您的报表服务器实例是可访问的。通过访问 Web 门户或服务 URL 对其进行测试。

  • 提供您的凭据。如果您已通过身份验证,则您使用的凭据有效。

  • 之后,转到目录\Program Files\Microsoft SQL Server\<INSTANCE_NAME>\Reporting Services\ReportServer并查找名为的文件rsreportserver.config

  • 找到这个片段

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

供您参考,这是我在配置期间用于测试我的实例的片段。

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。

于 2017-04-25T01:58:10.680 回答
0

我只想补充一点,我在使用codeplex ssrsphp时遇到了问题,因此我用谷歌搜索并找到了另一个运行良好的 sdk。我正在使用 php 7+。是链接,如果有任何与此相关的问题,我可以联系。

于 2018-08-11T19:47:59.907 回答