Jawaban:
Seperti ini untuk ip server:
$_SERVER['SERVER_ADDR'];
dan ini untuk pelabuhan
$_SERVER['SERVER_PORT'];
John K
sebaliknya
Jika Anda menggunakan PHP versi 5.3 atau lebih tinggi, Anda dapat melakukan hal berikut:
$host= gethostname();
$ip = gethostbyname($host);
Ini berfungsi dengan baik saat Anda menjalankan skrip yang berdiri sendiri, tidak melalui server web.
/etc/hosts
file dan akan cepat - meskipun mungkin saja 127.0.0.1
. Jika memang harus memanggil DNS maka akan lambat seperti yang Anda katakan.
sebagai contoh:
$_SERVER['SERVER_ADDR']
saat Anda menggunakan IIS, coba:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
hanya tersedia di bawah IIS ketika PHP dijalankan sebagai modul CGI.
Saya datang ke halaman ini mencari cara untuk mendapatkan alamat ip saya sendiri, bukan salah satu mesin jarak jauh yang terhubung ke saya.
Ini tidak akan bekerja untuk mesin windows.
Tetapi jika seseorang menelusuri apa yang saya cari:
#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;
(Tanpa malu-malu diadaptasi dari Bagaimana cara mendapatkan alamat IP utama dari mesin lokal di Linux dan OS X? )
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
Tak satu pun dari jawaban yang paling banyak dipilih akan mengembalikan alamat publik server dengan andal. Umumnya $_SERVER['SERVER_ADDR']
akan benar, tetapi jika Anda mengakses server melalui VPN, kemungkinan akan mengembalikan alamat jaringan internal daripada alamat publik, dan bahkan ketika tidak berada di jaringan yang sama beberapa konfigurasi hanya akan kosong atau ada yang lain ditentukan nilai.
Demikian juga, ada skenario di mana $host= gethostname(); $ip = gethostbyname($host);
tidak akan mengembalikan nilai yang benar karena mengandalkan DNS (baik yang dikonfigurasi secara internal atau catatan eksternal) dan pengaturan nama host server untuk memperkirakan alamat IP server. Kedua langkah ini berpotensi salah. Misalnya, jika nama host server diformat seperti nama domain (yaitu HOSTNAME=yahoo.com
) maka (setidaknya pada pengaturan php5.4 / Centos6 saya) gethostbyname
akan langsung langsung menemukan alamat Yahoo.com daripada server lokal.
Selanjutnya, karena gethostbyname
kembali ke catatan DNS publik server pengujian dengan catatan DNS publik yang tidak diterbitkan atau salah (misalnya, Anda mengakses server dengan localhost
atau alamat IP, atau jika Anda menimpa DNS publik menggunakan hosts
file lokal Anda ) maka Anda ' tidak akan mendapatkan kembali alamat IP (itu hanya akan mengembalikan nama host) atau lebih buruk lagi itu akan mengembalikan alamat yang salah yang ditentukan dalam catatan DNS publik jika ada atau jika ada karakter pengganti untuk domain tersebut.
Bergantung pada situasinya, Anda juga dapat mencoba pendekatan ketiga dengan melakukan sesuatu seperti ini:
$external_ip = exec('curl http://ipecho.net/plain; echo');
Ini memiliki kekurangannya sendiri (bergantung pada situs pihak ketiga tertentu, dan mungkin ada pengaturan jaringan yang merutekan koneksi keluar melalui host atau proxy yang berbeda) dan seperti gethostbyname
itu bisa lambat. Sejujurnya saya tidak yakin pendekatan mana yang paling sering benar, tetapi pelajaran yang perlu diperhatikan adalah bahwa skenario / konfigurasi tertentu akan menghasilkan keluaran yang salah untuk semua pendekatan ini ... jadi jika memungkinkan verifikasi bahwa pendekatan Anda menggunakan mengembalikan nilai yang Anda harapkan.
Inilah yang dapat Anda gunakan sebagai adaptasi dari contoh di atas tanpa khawatir curl terinstal di server Anda.
<?php
// create a new cURL resource
$ch = curl_init ();
// set URL and other appropriate options
curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL and pass it to the browser
$ip = curl_exec ($ch);
echo "The public ip for this server is: $ip";
// close cURL resource, and free up system resources
curl_close ($ch);
?>
Jika Anda menggunakan PHP di bash shell, Anda dapat menggunakan:
$server_name=exec('hostname');
Karena $_SERVER[] SERVER_ADDR
, HTTP_HOST
dan SERVER_NAME
tidak diatur.
Jawaban sebelumnya semuanya memberikan $ _SERVER ['SERVER_ADDR']. Ini tidak akan bekerja pada beberapa instalasi IIS. Jika Anda ingin ini bekerja di IIS, gunakan yang berikut ini:
$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
Saya menemukan ini bekerja untuk saya: GetHostByName ("");
Menjalankan XAMPP v1.7.1 di Windows 7 menjalankan server web Apache. Sayangnya itu hanya memberikan alamat IP gateway saya.
Saya baru saja membuat skrip sederhana yang akan mengembalikan $ _SERVER ['REMOTE_ADDR'] dan $ _SERVER ['SERVER_ADDR'] di IIS sehingga Anda tidak perlu mengubah setiap variabel. Cukup tempel teks ini di file php Anda yang disertakan di setiap halaman.
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Periksa array $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
tidak ada hubungannya dengan header HTTP. Ini diisi oleh perangkat lunak server, semua hal terkait HTTP di $ _SERVER diawali dengan HTTP_. php.net/manual/en/reserved.variables.server.php
Seperti ini:
$_SERVER['SERVER_ADDR'];