为了账号安全,请及时绑定邮箱和手机立即绑定

请教各位,Premature end of script headers:php.exe?

/ 猿问

请教各位,Premature end of script headers:php.exe?

小唯快跑啊 2019-06-04 11:07:43

为什么老是报这个错:Premature end of script headers:php.exe


查看完整描述

3 回答

?
月关宝盒

在之前的文章里面有提到过,写的cgi程序在后台服务器运行没有问题,如果使用前台URL调用,就会时不时的报出“internal server error”,查看apache的错误日志,会发现“Premature end of script headers”错误。关于这个错误在之前的文章里面也提到过。主要是三方面的原因:
1.在输出cgi头之前,有文本输出。
2.cgi程序中的路径错误
3.cgi的访问权限

根据这三点一一排查,均没有发现问题。奇怪的是cgi程序有时候能从前台url访问,有时候报错。cgi的程序权限也是755,是可以访问的。
仔细的想了想之后发现,问题其实在这里:cgi程序里面其实有些操作是创建文本并访问文本的。
例如:
fd = fopen("xxx.txt","w");
这时候创建出的文本文件使用权限实际上是随机分配的(从网上看到的,不是很确定)。当cgi在后台执行时,由于是用户是root用户,权限最大,在程序执行过程中不会遇到权限问题。当在前台url执行cgi时,虽然cgi程序的权限是755,程序能够被调用。但是程序在运行中创建的文本不确定其权限能否被前台的用户级别调用,因此就会出现在url调用时报错。
解决的方法如下:
在程序每次创建一个文件时,对这个文件的访问权限进行设置,使前台也能够具有访问权限(具体的读写权限根据自身需要设定)例如:
fd = fopen("xxx.txt","w");
chmod("xxx.txt",511);
511是十进制数,对应的八进制数为777,该值表示所有用户对该文件都具有读、写、执行权限。

这样设置之后,就不会再出现cgi在服务器正常执行,url调用报错的问题。其实这个问题解决起来很简单,但是就是很隐蔽,一般不容易发现。下次在写cgi程序的时候对访问权限的问题应该更加关注些。

查看完整回答
反对 回复 2019-06-08
?
慕前端131612

主页index.php代码如下:

PHP code?

<?php
require 'lib/core/DBAccess.class';
require 'lib/core/Object.class';
require 'action/default/WebBase.class.php';
require 'action/default/WebLoginBase.class.php';

require 'config.php';

//print_r($_SERVER);exit;
$para=array();

if(isset($_SERVER['PATH_INFO'])){
$para=explode('/', substr($_SERVER['PATH_INFO'],1));
if($control=array_shift($para)){
if(count($para)){
$action=array_shift($para);
}else{
$action=$control;
$control='index';
}
}else{
$control='index';
$action='main';
}
}else{
$control='index';
$action='main';
}
$control=ucfirst($control);

if(strpos($action,'-')!==false){
list($action, $page)=explode('-',$action);
}

$file=$conf['action']['modals'].$control.'.class.php';

if(!is_file($file)) notfound('找不到控制器');
try{
require $file;
}catch(Exception $e){
print_r($e);
exit;
}

if(!class_exists($control)) notfound('找不到控制器1');
$jms=new $control($conf['db']['dsn'], $conf['db']['user'], $conf['db']['password']);
$jms->debugLevel=$conf['debug']['level'];

if(!method_exists($jms, $action)) notfound('方法不存在');
$reflection=new ReflectionMethod($jms, $action);
if($reflection->isStatic()) notfound('不允许调用Static修饰的方法');
if(!$reflection->isFinal()) notfound('只能调用final修饰的方法');

$jms->controller=$control;
$jms->action=$action;

$jms->charset=$conf['db']['charset'];
$jms->cacheDir=$conf['cache']['dir'];
$jms->setCacheDir($conf['cache']['dir']);
$jms->actionTemplate=$conf['action']['template'];
$jms->prename=$conf['db']['prename'];
$jms->title=$conf['web']['title'];
if(method_exists($jms, 'getSystemSettings')) $jms->getSystemSettings();

if($jms->settings['switchWeb']=='0'){
$jms->display('close-service.php');
exit;
}

if(isset($page)) $jms->page=$page;

if($q=$_SERVER['QUERY_STRING']){
$para=array_merge($para, explode('/', $q));
}

if($para==null) $para=array();

$jms->headers=getallheaders();
if(isset($jms->headers['x-call'])){
// 函数调用
header('content-Type: application/json');
try{
ob_start();
echo json_encode($reflection->invokeArgs($jms, $_POST));
ob_flush();
}catch(Exception $e){
$jms->error($e->getMessage(), true);
}
}elseif(isset($jms->headers['x-form-call'])){

// 表单调用
$accept=strpos($jms->headers['Accept'], 'application/json')===0;
if($accept) header('content-Type: application/json');
try{
ob_start();
if($accept){
echo json_encode($reflection->invokeArgs($jms, $_POST));
}else{
json_encode($reflection->invokeArgs($jms, $_POST));
}
ob_flush();
}catch(Exception $e){
$jms->error($e->getMessage(), true);
}
}elseif(strpos($jms->headers['Accept'], 'application/json')===0){
// AJAX调用
header('content-Type: application/json');
try{

//echo json_encode($reflection->invokeArgs($jms, $para));
echo json_encode(call_user_func_array(array($jms, $action), $para));
}catch(Exception $e){
$jms->error($e->getmessage());
}
}else{
// 普通请求
header('content-Type: text/html;charset=utf-8');
//$reflection->invokeArgs($jms, $para);
call_user_func_array(array($jms, $action), $para);
}
$jms=null;

function notfound($message){
header('content-Type: text/plain; charset=utf8');
header('HTTP/1.1 404 Not Found');
die($message);
}

查看完整回答
反对 回复 2019-06-08

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信