Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In PHP < 5.4 is there any way to get a status response code you just set?

Tags:

php

apache

I know in php 5.4 there is a new function http_response_code(), but in prior versions how would you get a response code you just set?

Similar to Is there any way to get the current HTTP response code from PHP?

I have this need:

 //sometime earlier
 header('HTTP/1.1 404 Not Found');


//sometime later, detect if error was set
$status = some_magic_way_to_find_status();

Does anyone have a way in php 5.3 or below to do this?

like image 796
Ray Avatar asked Aug 24 '12 15:08

Ray


People also ask

How do I get a status code response?

To get the status code of an HTTP request made with the fetch method, access the status property on the response object. The response. status property contains the HTTP status code of the response, e.g. 200 for a successful response or 500 for a server error. Copied!

How do I get HTTP response in PHP?

For PHP versions 4.0: In order to send the HTTP response code, we need to assemble the response code. To achieve this, use header() function. The header() function contains a special use-case which can detect a HTTP response line and replace that with a custom one. header( "HTTP/1.1 404 Not Found" );

What is PHP status code?

PHP is a scripting language that can generate status-code data. While your content management system, possibly (WordPress) and your web server (possibly Apache) can generate these codes, the scripting language PHP, which is the basis of WordPress, can also generate these codes.

Which HTTP status code do you receive for a non existing page?

HTTP Status Code 404 - Not Found This means the file or page that the browser is requesting wasn't found by the server. 404s don't indicate whether the missing page or resource is missing permanently or only temporarily. You can see what this looks like on your site by typing in a URL that doesn't exist.


2 Answers

EDIT: As @Esailija wrote: Notice that you need to rewrite all your header calls to use this function for this to work

Found this code in the manual, http://www.php.net/manual/en/function.http-response-code.php#107261

<?php

    if (!function_exists('http_response_code')) {
        function http_response_code($code = NULL) {

            if ($code !== NULL) {

                switch ($code) {
                    case 100: $text = 'Continue'; break;
                    case 101: $text = 'Switching Protocols'; break;
                    case 200: $text = 'OK'; break;
                    case 201: $text = 'Created'; break;
                    case 202: $text = 'Accepted'; break;
                    case 203: $text = 'Non-Authoritative Information'; break;
                    case 204: $text = 'No Content'; break;
                    case 205: $text = 'Reset Content'; break;
                    case 206: $text = 'Partial Content'; break;
                    case 300: $text = 'Multiple Choices'; break;
                    case 301: $text = 'Moved Permanently'; break;
                    case 302: $text = 'Moved Temporarily'; break;
                    case 303: $text = 'See Other'; break;
                    case 304: $text = 'Not Modified'; break;
                    case 305: $text = 'Use Proxy'; break;
                    case 400: $text = 'Bad Request'; break;
                    case 401: $text = 'Unauthorized'; break;
                    case 402: $text = 'Payment Required'; break;
                    case 403: $text = 'Forbidden'; break;
                    case 404: $text = 'Not Found'; break;
                    case 405: $text = 'Method Not Allowed'; break;
                    case 406: $text = 'Not Acceptable'; break;
                    case 407: $text = 'Proxy Authentication Required'; break;
                    case 408: $text = 'Request Time-out'; break;
                    case 409: $text = 'Conflict'; break;
                    case 410: $text = 'Gone'; break;
                    case 411: $text = 'Length Required'; break;
                    case 412: $text = 'Precondition Failed'; break;
                    case 413: $text = 'Request Entity Too Large'; break;
                    case 414: $text = 'Request-URI Too Large'; break;
                    case 415: $text = 'Unsupported Media Type'; break;
                    case 500: $text = 'Internal Server Error'; break;
                    case 501: $text = 'Not Implemented'; break;
                    case 502: $text = 'Bad Gateway'; break;
                    case 503: $text = 'Service Unavailable'; break;
                    case 504: $text = 'Gateway Time-out'; break;
                    case 505: $text = 'HTTP Version not supported'; break;
                    default:
                        exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
                }

                $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');

                header($protocol . ' ' . $code . ' ' . $text);

                $GLOBALS['http_response_code'] = $code;

            } else {

                $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);

            }

            return $code;

        }
    }

?>
like image 151
Ofir Baruch Avatar answered Oct 05 '22 11:10

Ofir Baruch


I don't think it's possible.

You could wrap the header() function:

function my_status_header($setHeader=null) {
    static $theHeader=null;
    //if we already set it, then return what we set before (can't set it twice anyway)
    if($theHeader) {return $theHeader;}
    $theHeader = $setHeader;
    header('HTTP/1.1 '.$setHeader);
    return $setHeader;
}

Or, of course, you could always upgrade to PHP5.4.

like image 43
SDC Avatar answered Oct 05 '22 11:10

SDC