আমার কম্পিউটারের স্থানীয় আইপি 192 এর মতো হওয়া দরকার * * .... পিএইচপি দিয়ে কি এটি সম্ভব?
আমার স্ক্রিপ্ট চলমান আইপি ঠিকানা প্রয়োজন, তবে আমার বাহ্যিক আইপি দরকার নেই, আমার তার স্থানীয় নেটওয়ার্ক কার্ডের ঠিকানা প্রয়োজন।
উত্তর:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
সাইটের ডোমেন নামটি ফেরায় না।
এটি একটি পুরানো পোস্ট, তবে এটি দিয়ে এটি পান:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
উদাহরণ স্বরূপ:
die( getLocalIp() );
এটি অন্য সাইটে পাওয়া গেছে, ট্রিম কমান্ডটি সরাবেন না কারণ অন্যথায় আপনি কম্পিউটারের নাম পাবেন।
ব্যাকটিক্স (বিশেষ উদ্ধৃতি): এটি কাজ করে কারণ পিএইচপি শেল কমান্ড হিসাবে সেই "বিশেষ উক্তি" (ব্যাকটিক্স) এর মধ্যে যা কিছু চালাতে চেষ্টা করবে এবং ফলস্বরূপ আউটপুট প্রদান করবে।
gethostbyname(trim(`hostname`));
করণের তুলনায় খুব অনুরূপ (তবে অনেক বেশি দক্ষ):
$exec = exec("hostname"); //the "hostname" is a valid command in both windows and linux
$hostname = trim($exec); //remove any spaces before and after
$ip = gethostbyname($hostname); //resolves the hostname using local hosts resolver or DNS
gethostbyname
হোস্ট মেশিনের জন্য একটি লুপব্যাক আইপি (যেমন 127.0.0.1) ফেরত পাওয়া সম্ভব এবং বৈধ ।
এটি চেষ্টা করুন (যদি আপনার সার্ভারটি লিনাক্স হয়):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
উপযুক্ত ইন্টারফেস।
wlan0
পরিবর্তে eth0
এবং প্রতিস্থাপন 'inet addr:'
সঙ্গে 'inet adr:'
সম্ভবত আমার সিস্টেম (fr_FR) ব্যবহার লোকেল কারণে। তা ছাড়া, এই উত্তরটি আমি সলিউশনটি খুঁজছিলাম। ধন্যবাদ!
'inet adr:'
আমার টার্মিনালটিতে (ফরাসি স্থানীয়) কাজ করেছে, তবে পিএইচপি স্ক্রিপ্টে 'inet addr:'
সঠিক মান ছিল (ইংরেজি স্থানীয়, আমার ধারণা)।
স্থানীয় মেশিনের ডিফল্ট বাহ্যিক আইপি ঠিকানাটি এই জাতীয়ভাবে পাওয়া যেতে পারে:
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, "8.8.8.8", 53);
socket_getsockname($sock, $name); // $name passed by reference
$localAddr = $name;
কিভাবে এটা কাজ করে:
যেহেতু এটি ইউডিপি, socket_connect
তাই নেটওয়ার্কে বের হয় না। এটি সকেটে কেবল একটি স্থানীয় ঠিকানা এবং পোর্ট বরাদ্দ করে। এটি আমাদের স্থানীয় ঠিকানা পেতে সহায়তা করে।
এই সমাধানটি কোনও নেটওয়ার্ক ট্র্যাফিক, ডিএনএস বা কমান্ড কার্যকর করা ছাড়াই কাজ করে।
কোনও রুট না থাকলে এটি কাজ করতে পারে না 8.8.8.8
(যেমন আপনার কোনও ইন্টারনেট সংযোগ নেই)।
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
পিএইচপি-তে মডিউল ইনস্টল এবং সক্ষম হওয়া উচিত উল্লেখ করা গুরুত্বপূর্ণ ।
স্থানীয় দ্বারা আপনি কী বোঝাতে চান তা নির্ভর করে:
স্থানীয়ভাবে যদি আপনি পিএইচপি কোডটি কার্যকরকারী সার্ভার / সিস্টেমের ঠিকানা বলতে চান, তবে এখনও আলোচনা করার দুটি উপায় রয়েছে। যদি পিএইচপি কোনও ওয়েব সার্ভারের মাধ্যমে চলতে থাকে তবে আপনি পড়ার মাধ্যমে সার্ভারের ঠিকানা পেতে পারেন $_SERVER['SERVER_ADDR']
। যদি পিএইচপি কোনও কমান্ড লাইন ইন্টারফেসের মাধ্যমে পরিচালিত হয়, তবে আপনাকে সম্ভবত শেল-এক্সিকিউট ipconfig
(উইন্ডোজ) / ifconfig
(* নিক্স) এবং ঠিকানাটি গ্রেপ করতে হবে।
স্থানীয়ভাবে যদি আপনি ওয়েবসাইটের দর্শকের দূরবর্তী ঠিকানা বোঝাতে চান তবে তাদের বাহ্যিক আইপি ঠিকানা নয় (যেহেতু আপনি নির্দিষ্টভাবে 192 বলেছিলেন। *), তবে আপনার ভাগ্য নেই। NAT রাউটিংয়ের পুরো পয়েন্টটি সেই ঠিকানাটি আড়াল করা। আপনি কোনও আইপি ঠিকানার পিছনে পৃথক কম্পিউটারের স্থানীয় ঠিকানাগুলি সনাক্ত করতে পারবেন না, তবে কিছু কৌশল (ব্যবহারকারীর এজেন্ট, সম্ভবত ম্যাক ঠিকানা) রয়েছে যা একই আইপি থেকে একাধিক কম্পিউটার অ্যাক্সেস করতে পারলে আলাদা করতে সহায়তা করতে পারে।
আপনি লিনাক্স হোস্টে সিআইএলিতে নিয়মিত ব্যবহারকারী হিসাবে এটি ব্যবহার করতে পারেন:
function get_local_ipv4() {
$out = split(PHP_EOL,shell_exec("/sbin/ifconfig"));
$local_addrs = array();
$ifname = 'unknown';
foreach($out as $str) {
$matches = array();
if(preg_match('/^([a-z0-9]+)(:\d{1,2})?(\s)+Link/',$str,$matches)) {
$ifname = $matches[1];
if(strlen($matches[2])>0) {
$ifname .= $matches[2];
}
} elseif(preg_match('/inet addr:((?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3})\s/',$str,$matches)) {
$local_addrs[$ifname] = $matches[1];
}
}
return $local_addrs;
}
$addrs = get_local_ipv4();
var_export($addrs);
আউটপুট:
array (
'eth0' => '192.168.1.1',
'eth0:0' => '192.168.2.1',
'lo' => '127.0.0.1',
'vboxnet0' => '192.168.56.1',
)
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )
আমি এটা বুজেছি. আমি পিএইচপি ফাইলে এই কোডটি যুক্ত করেছি
split()
পিএইচপি 5.3.0 হিসাবে ফাংশনটি অগ্রাহ্য করা হয়েছে। explode()
পরিবর্তে ব্যবহারের পরামর্শ দিন
$localIP = gethostbyname(trim(exec("hostname")));
আমি উইন্ডোজ পিসিতে এবং এর কাজ করে দেখেছি এবং এটিও লিনাক্সে কাজ করব বলে মনে করি।
এটি খুব সহজ এবং উপরের উত্তরগুলি জটিল জিনিস। কেবলমাত্র আপনি এই পদ্ধতিটি ব্যবহার করে স্থানীয় এবং সর্বজনীন আইপি ঠিকানাগুলি পেতে পারেন।
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
এটা সহজ এক। আপনি এই সাধারণ কোড দ্বারা হোস্টের নাম পেতে পারেন।
$ip = getHostByName(getHostName());
অথবা আপনি $_SERVER['HTTP_HOST']
হোস্টের নাম পেতেও ব্যবহার করতে পারেন।
আমি এই প্রশ্নটি দিয়ে সার্ভার-সাইড পিএইচপি (লিনাক্স টার্মিনাল থেকে চলমান) দিয়ে গেছি
আমি 'ifconfig' বিস্ফোরণ এবং এটি আইপি ঠিকানায় ছাঁটা।
এটা এখানে:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
এবং অবশ্যই আপনার পছন্দসই নেটওয়ার্ক ডিভাইসে 'wlan0' পরিবর্তন করুন।
আমার ফলাফল:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
মূলের সাথে সম্পর্কিত পাথের সাথে বর্তমান স্ক্রিপ্টের ফাইলের নাম ফেরত দেয়
SERVER_PROTOCOL
পৃষ্ঠা-অনুরোধ করা প্রোটোকলের নাম এবং সংশোধন ফিরিয়ে দেয়
REQUEST_METHOD
পৃষ্ঠাটি অ্যাক্সেস করতে ব্যবহৃত অনুরোধ পদ্ধতিটি ফেরত দেয়
DOCUMENT_ROOT
বর্তমান স্ক্রিপ্টটি চালাচ্ছে সেই রুট ডিরেক্টরিটি ফিরিয়ে দেয়
এটা চেষ্টা কর
$localIP = gethostbyname(trim('hostname'));