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 时遇到了问题,如果有任何与此相关的问题,我可以随时联系。
我正在使用 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 时遇到了问题,如果有任何与此相关的问题,我可以随时联系。