How to get user IP address, OS, browser and country in PHP
As a developer, you may want to collect your website users’ information such as their IP addresses, their operating system, the browser, and the country from which they are accessing the site.
You may do this to track user activities for security reasons or for a better user experience in order to serve users with content that is more personalized content for their region/country.
How to collect user IP address
It is very easy to get user IP address in PHP using the superglobal variable $_SERVER which provides the server and environment-related information.
Below are the following ways in which you can collect the IP using the $_SERVER variable:
1. $_SERVER[‘REMOTE_ADDR’] — This contains the real IP address of the client. That is the most reliable value you can find from the user.
2. $_SERVER[‘HTTP_CLIENT_IP’] — This will fetch the IP address when the user is from shared Internet services.
3. $_SERVER[‘HTTP_X_FORWARDED_FOR’] — This will fetch the IP address from the user when he/she is behind the proxy.
The simplest way is just to collect the REMOTE_ADDR as below:
However, the user can be behind a proxy server in which case the proxy may have set the $_SERVER[‘HTTP_X_FORWARDED_FOR’] and in this case, the $_SERVER[‘REMOTE_ADDR’] fails to return the correct IP address of the user.
Use the sample code below to get the more accurate one:
else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) < $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; >else < $ip = $_SERVER['REMOTE_ADDR']; >echo "IP address is: ".$ip;
How to get user OS and browser
You also correct the client information in PHP through the use of the variable $_SERVER.
Simply use the code below:
The above code should give the result as below:
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
If you just want to simply collect the OS name and the browser name and version, simply do this:
"; echo "Browser: ".end(explode(" ",$client));
It should give you the result as below depending on your OS and browser:
Operating system: Ubuntu
Browser: Firefox/91.0
How to get user country
It is possible to get the country information of the website user, using their IP address with the help of the geoplugin.net API.
Simply get the PHP curl GET request as below:
This request will give you a JSON response as below:
You can extract the JSON data to PHP variables for user as shown below:
geoplugin_continentName."
"; echo "Country Name: ".$params->geoplugin_countryName."
"; echo "Country Code: ".$params->geoplugin_countryCode."
"; echo "City Name: ".$params->geoplugin_city;
The above code should print out the result as shown below:
Continent Name: Africa
Country Name: Kenya
Country Code: KE
City Name: Nairobi
Conclusion
It is possible to collect important user information on your website for specific reasons such as tracking and security reasons, customizing the site content based on their region, web browser, etc.
In this article, we have covered how you can collect user IP address, web browser, operating system, and the country they are from using PHP. It’s my hope that the article has answered your question or it has been useful to you.
Related Articles
curl_setopt
true to disable the progress meter for cURL transfers.
Note:
PHP automatically sets this option to true , this should only be changed for debugging purposes.
The HTTP authentication method(s) to use. The options are: CURLAUTH_BASIC , CURLAUTH_DIGEST , CURLAUTH_GSSNEGOTIATE , CURLAUTH_NTLM , CURLAUTH_ANY , and CURLAUTH_ANYSAFE .
The bitwise | (or) operator can be used to combine more than one method. If this is done, cURL will poll the server to see what methods it supports and pick the best one.
CURLAUTH_ANY is an alias for CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .
CURLAUTH_ANYSAFE is an alias for CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .
Bitmask of CURLPROTO_* values. If used, this bitmask limits what protocols libcurl may use in the transfer. This allows you to have a libcurl built to support a wide range of protocols but still limit specific transfers to only be allowed to use a subset of them. By default libcurl will accept all protocols it supports. See also CURLOPT_REDIR_PROTOCOLS .
Valid protocol options are: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS , CURLPROTO_DICT , CURLPROTO_FILE , CURLPROTO_TFTP , CURLPROTO_ALL
The SOCKS5 authentication method(s) to use. The options are: CURLAUTH_BASIC , CURLAUTH_GSSAPI , CURLAUTH_NONE .
The bitwise | (or) operator can be used to combine more than one method. If this is done, cURL will poll the server to see what methods it supports and pick the best one.
CURLAUTH_BASIC allows username/password authentication.
CURLAUTH_GSSAPI allows GSS-API authentication.
CURLAUTH_NONE allows no authentication.
Defaults to CURLAUTH_BASIC|CURLAUTH_GSSAPI . Set the actual username and password with the CURLOPT_PROXYUSERPWD option.
Note:
Your best bet is to not set this and let it use the default. Setting it to 2 or 3 is very dangerous given the known vulnerabilities in SSLv2 and SSLv3.
Note:
Your best bet is to not set this and let it use the default CURL_SSLVERSION_DEFAULT which will attempt to figure out the remote SSL protocol version.
A custom request method to use instead of «GET» or «HEAD» when doing a HTTP request. This is useful for doing «DELETE» or other, more obscure HTTP requests. Valid values are things like «GET» , «POST» , «CONNECT» and so on; i.e. Do not enter a whole HTTP request line here. For instance, entering «GET /index.html HTTP/1.0\r\n\r\n» would be incorrect.
Note:
Don’t do this without making sure the server supports the custom request method first.
The default protocol to use if the URL is missing a scheme name.
Set the name of the network interface that the DNS resolver should bind to. This must be an interface name (not an address).
Set the local IPv4 address that the resolver should bind to. The argument should contain a single numerical IPv4 address as a string.
Set the local IPv6 address that the resolver should bind to. The argument should contain a single numerical IPv6 address as a string.
Note:
Secure Remote Password (SRP) authentication for TLS provides mutual authentication if both sides have a shared secret. To use TLS-SRP, you must also set the CURLOPT_PROXY_TLSAUTH_USERNAME and CURLOPT_PROXY_TLSAUTH_PASSWORD options.
The secret password needed to use the private SSL key specified in CURLOPT_SSLKEY .
Note:
Since this option contains a sensitive password, remember to keep the PHP script it is contained within safe.
value should be an array for the following values of the option parameter:
Option | Set value to | Notes |
---|---|---|
CURLOPT_CONNECT_TO | Connect to a specific host and port instead of the URL’s host and port. Accepts an array of strings with the format HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT . | Added in cURL 7.49.0. Available since PHP 7.0.7. |
CURLOPT_HTTP200ALIASES | An array of HTTP 200 responses that will be treated as valid responses and not as errors. | Added in cURL 7.10.3. |
CURLOPT_HTTPHEADER | An array of HTTP header fields to set, in the format array(‘Content-type: text/plain’, ‘Content-length: 100’) | |
CURLOPT_POSTQUOTE | An array of FTP commands to execute on the server after the FTP request has been performed. | |
CURLOPT_PROXYHEADER | An array of custom HTTP headers to pass to proxies. | Added in cURL 7.37.0. Available since PHP 7.0.7. |
CURLOPT_QUOTE | An array of FTP commands to execute on the server prior to the FTP request. | |
CURLOPT_RESOLVE | Provide a custom address for a specific host and port pair. An array of hostname, port, and IP address strings, each element separated by a colon. In the format: array(«example.com:80:127.0.0.1») | Added in cURL 7.21.3. |
value should be a stream resource (using fopen() , for example) for the following values of the option parameter:
Option | Set value to |
---|---|
CURLOPT_FILE | The file that the transfer should be written to. The default is STDOUT (the browser window). |
CURLOPT_INFILE | The file that the transfer should be read from when uploading. |
CURLOPT_STDERR | An alternative location to output errors to instead of STDERR . |
CURLOPT_WRITEHEADER | The file that the header part of the transfer is written to. |
A callback accepting five parameters. The first is the cURL resource, the second is the total number of bytes expected to be downloaded in this transfer, the third is the number of bytes downloaded so far, the fourth is the total number of bytes expected to be uploaded in this transfer, and the fifth is the number of bytes uploaded so far.
Note:
The callback is only called when the CURLOPT_NOPROGRESS option is set to false .
Return a non-zero value to abort the transfer. In which case, the transfer will set a CURLE_ABORTED_BY_CALLBACK error.
Other values:
Option | Set value to |
---|---|
CURLOPT_SHARE | A result of curl_share_init() . Makes the cURL handle to use the data from the shared handle. |
Return Values
Returns true on success or false on failure.
Changelog
Version | Description |
---|---|
8.0.0 | handle expects a CurlHandle instance now; previously, a resource was expected. |
7.3.15, 7.4.3 | Introduced CURLOPT_HTTP09_ALLOWED . |
7.3.0 | Introduced CURLOPT_ABSTRACT_UNIX_SOCKET , CURLOPT_KEEP_SENDING_ON_ERROR , CURLOPT_PRE_PROXY , CURLOPT_PROXY_CAINFO , CURLOPT_PROXY_CAPATH , CURLOPT_PROXY_CRLFILE , CURLOPT_PROXY_KEYPASSWD , CURLOPT_PROXY_PINNEDPUBLICKEY , CURLOPT_PROXY_SSLCERT , CURLOPT_PROXY_SSLCERTTYPE , CURLOPT_PROXY_SSL_CIPHER_LIST , CURLOPT_PROXY_SSLKEY , CURLOPT_PROXY_SSLKEYTYPE , CURLOPT_PROXY_SSL_OPTIONS , CURLOPT_PROXY_SSL_VERIFYHOST , CURLOPT_PROXY_SSL_VERIFYPEER , CURLOPT_PROXY_SSLVERSION , CURLOPT_PROXY_TLSAUTH_PASSWORD , CURLOPT_PROXY_TLSAUTH_TYPE , CURLOPT_PROXY_TLSAUTH_USERNAME , CURLOPT_SOCKS5_AUTH , CURLOPT_SUPPRESS_CONNECT_HEADERS , CURLOPT_DISALLOW_USERNAME_IN_URL , CURLOPT_DNS_SHUFFLE_ADDRESSES , CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS , CURLOPT_HAPROXYPROTOCOL , CURLOPT_PROXY_TLS13_CIPHERS , CURLOPT_SSH_COMPRESSION , CURLOPT_TIMEVALUE_LARGE and CURLOPT_TLS13_CIPHERS . |
7.0.7 | Introduced CURL_HTTP_VERSION_2 , CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE , CURL_HTTP_VERSION_2TLS , CURL_REDIR_POST_301 , CURL_REDIR_POST_302 , CURL_REDIR_POST_303 , CURL_REDIR_POST_ALL , CURL_VERSION_KERBEROS5 , CURL_VERSION_PSL , CURL_VERSION_UNIX_SOCKETS , CURLAUTH_NEGOTIATE , CURLAUTH_NTLM_WB , CURLFTP_CREATE_DIR , CURLFTP_CREATE_DIR_NONE , CURLFTP_CREATE_DIR_RETRY , CURLHEADER_SEPARATE , CURLHEADER_UNIFIED , CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE , CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE , CURLMOPT_MAX_HOST_CONNECTIONS , CURLMOPT_MAX_PIPELINE_LENGTH , CURLMOPT_MAX_TOTAL_CONNECTIONS , CURLOPT_CONNECT_TO , CURLOPT_DEFAULT_PROTOCOL , CURLOPT_DNS_INTERFACE , CURLOPT_DNS_LOCAL_IP4 , CURLOPT_DNS_LOCAL_IP6 , CURLOPT_EXPECT_100_TIMEOUT_MS , CURLOPT_HEADEROPT , CURLOPT_LOGIN_OPTIONS , CURLOPT_PATH_AS_IS , CURLOPT_PINNEDPUBLICKEY , CURLOPT_PIPEWAIT , CURLOPT_PROXY_SERVICE_NAME , CURLOPT_PROXYHEADER , CURLOPT_SASL_IR , CURLOPT_SERVICE_NAME , CURLOPT_SSL_ENABLE_ALPN , CURLOPT_SSL_ENABLE_NPN , CURLOPT_SSL_FALSESTART , CURLOPT_SSL_VERIFYSTATUS , CURLOPT_STREAM_WEIGHT , CURLOPT_TCP_FASTOPEN , CURLOPT_TFTP_NO_OPTIONS , CURLOPT_UNIX_SOCKET_PATH , CURLOPT_XOAUTH2_BEARER , CURLPROTO_SMB , CURLPROTO_SMBS , CURLPROXY_HTTP_1_0 , CURLSSH_AUTH_AGENT and CURLSSLOPT_NO_REVOKE . |
Examples
Example #1 Initializing a new cURL session and fetching a web page
// create a new cURL resource
$ch = curl_init ();
?php
// set URL and other appropriate options
curl_setopt ( $ch , CURLOPT_URL , «http://www.example.com/» );
curl_setopt ( $ch , CURLOPT_HEADER , false );
// grab URL and pass it to the browser
curl_exec ( $ch );
// close cURL resource, and free up system resources
curl_close ( $ch );
?>
Notes
Note:
Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data, while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded.