সিস্টেমের স্থানীয় আইপি কীভাবে পাবেন পিএইচপি


96

আমার কম্পিউটারের স্থানীয় আইপি 192 এর মতো হওয়া দরকার * * .... পিএইচপি দিয়ে কি এটি সম্ভব?

আমার স্ক্রিপ্ট চলমান আইপি ঠিকানা প্রয়োজন, তবে আমার বাহ্যিক আইপি দরকার নেই, আমার তার স্থানীয় নেটওয়ার্ক কার্ডের ঠিকানা প্রয়োজন।

উত্তর:


112

সিএলআই থেকে

পিএইচপি <5.3.0

$localIP = getHostByName(php_uname('n'));

পিএইচপি> = 5.3.0

$localIP = getHostByName(getHostName());


4
এই সমাধানটি আমার পক্ষে কাজ করেছে এবং এটি শেল কল করা, অপারেটিং সিস্টেমের কমান্ড এবং এমন সমস্ত ধরণের স্টাফ এড়ানো এড়ানো যায় যা সুরক্ষা গর্তগুলি খুলতে পারে বা বিজোড় সমস্যাগুলি পরে উত্থাপন করতে পারে।
দারিও ফুমাগল্লি

4
সর্বোত্তম প্রতিক্রিয়া সাধারণত সরলতার সাথে আসে। সে রকমই.
m3nda

4
@ andras.tim আমি সাধারণ উত্তরগুলি পছন্দ করি, তবে আমি যখন আপনার স্ক্রিপ্টটি চালিয়েছি এটি আমার মেশিনের আইপি ঠিকানাটি ফিরিয়ে দিচ্ছে না, এটি আমার ভার্চুয়াল মেশিনে ব্যবহৃত আইপি ঠিকানাটি ফেরত দিচ্ছে ... তবে কী সমস্যা হতে পারে?
স্কারেল

কেবল সচেতন থাকুন, এই পদ্ধতির ডিএনএসের উপর নির্ভর করে সিস্টেমের হোস্টনামটি যা সেট করা আছে তা সঠিকভাবে সমাধান করতে পারে। যে সর্বদা ক্ষেত্রে হবে না।
জাস্টিন ম্যাকএলেয়ার

4
মেঘ হোস্টিং পরিবেশে, এটি প্রত্যাশিত ফলাফল ফিরে নাও আসতে পারে। কারণ প্রতিটি হোস্টের 2 টিরও বেশি আইপি থাকে।
ইউনিক্সআগেইন

60
$_SERVER['SERVER_ADDR']

13
স্পষ্টকরণ: একটি কম্পিউটারে বেশ কয়েকটি আইপি ঠিকানা থাকতে পারে। এই পরিবর্তনশীলটি কেবলমাত্র HTTP- র মধ্যে রয়েছে এবং এতে ভার্চুয়াল হোস্টের আইপি ঠিকানা রয়েছে। প্রশ্নটি কতটা অস্পষ্ট, তা দেওয়া প্রত্যাশিত উত্তর কিনা তা বলা শক্ত।
আলভারো গঞ্জালেজ

আমি মনে করি এটি সঠিক, কারণ আপনার সর্বদা স্বাক্ষরিত আইপি প্রয়োজন, তিনি আপনাকে উত্তর দিচ্ছেন। যদি তা না হয় তবে আপনাকে অবশ্যই @ andras.tim এর asnwers ব্যবহার করতে হবে কারণ এটি আপনাকে সিস্টেমের প্রধান আইপি বলে।
m3nda

এটি হ'ল আমি যা চেয়েছিলাম, কারণ আমার সার্ভারগুলি লোড ব্যালান্সারের পিছনে তাই getHostNameসাইটের ডোমেন নামটি ফেরায় না।
হ্যাঁ_আইটি এর_আমি

আপনি কোনও
ডকারের ধারকের

31

এটি একটি পুরানো পোস্ট, তবে এটি দিয়ে এটি পান:

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

7
@ পল: বিশেষ উক্তিগুলির কারণে, যখন আপনি সাধারণ উক্তি ব্যবহার করেন এটি কোনও কারণে কার্যকর হয় না এবং আপনি যখন ট্রিম কমান্ডটি সরিয়ে দেন এটি এমনকি কার্যকর হয় না। আমি জানি এটা অদ্ভুত লাগছে। এটির জন্য উত্তরটি কমানোর জন্য ভাল নয়। উত্তর পড়ুন।
কোডবিট

4
ব্যাকটিক্স (`) কে পিএইচপি-তে এক্সিকিউশন অপারেটর বলা হয়। আপনি প্রথম কোড ব্লকে যা করছেন তা প্রায়শই নির্বাহী কমান্ডের মতো। পিএইচপি
খ্রিস্টিয়ান

4
আসলেই সেরা ধারণা নয়। gethostbynameহোস্ট মেশিনের জন্য একটি লুপব্যাক আইপি (যেমন 127.0.0.1) ফেরত পাওয়া সম্ভব এবং বৈধ ।
কেউ

4
এটি আমাকে অনেক সাহায্য করে, আমি ভেবেছিলাম PH _SERVER ['REMOTE_ADDR'] এর মতো সহজ পিএইচপি ফাংশন থাকবে ; যা কার্যকর হয়নি, তবে এই সমাধানটি আমার পক্ষে কাজ করেছে !!!
পিনি চেনি

24

এটি চেষ্টা করুন (যদি আপনার সার্ভারটি লিনাক্স হয়):

$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;

9
একেবারে ঠিক নয়। কোনও গ্যারান্টি নেই eth0উপযুক্ত ইন্টারফেস।
কেউই নয়

ধন্যবাদ, এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে। ইন্টারফেস সেট করতে সক্ষম হচ্ছেন!
রহিম খোজা

আমার ক্ষেত্রে (ওয়াইফাই স্থানীয় নেটওয়ার্ক স্থানীয় আইপি) আমি উল্লেখ করতে ছিল wlan0পরিবর্তে eth0এবং প্রতিস্থাপন 'inet addr:'সঙ্গে 'inet adr:'সম্ভবত আমার সিস্টেম (fr_FR) ব্যবহার লোকেল কারণে। তা ছাড়া, এই উত্তরটি আমি সলিউশনটি খুঁজছিলাম। ধন্যবাদ!
নিয়াবলিস

আসলে 'inet adr:'আমার টার্মিনালটিতে (ফরাসি স্থানীয়) কাজ করেছে, তবে পিএইচপি স্ক্রিপ্টে 'inet addr:'সঠিক মান ছিল (ইংরেজি স্থানীয়, আমার ধারণা)।
নিয়াভ্লিজ

22

স্থানীয় মেশিনের ডিফল্ট বাহ্যিক আইপি ঠিকানাটি এই জাতীয়ভাবে পাওয়া যেতে পারে:

$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(যেমন আপনার কোনও ইন্টারনেট সংযোগ নেই)।


4
এই উত্তরটি অন্যের চেয়ে ভাল। $ _SERVER অ্যারেতে কোনও নির্ভরতা অ্যাপাচি অধীনে চলমান উপর নির্ভর করে। এই ধারণাটি ক্রোন কাজের ক্ষেত্রেও কাজ করে। কোনও সার্ভার স্টেজিং বা প্রোডাকশন ল্যানে চলমান থাকলে কেবলমাত্র নির্দিষ্ট ফাংশনগুলি সম্পাদন করতে আমি এটি ব্যবহার করছি। পারফেক্ট!
প্রতি

এটি একটি স্পষ্ট উত্তর। ডকার নেটওয়ার্কে আমার হোস্টের আইপি পেতে আমি এটি একটি স্ক্রিপ্টে ডকারের পাত্রে পরিচালনার জন্য রূপান্তরিত করেছি:$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
ফাদারশাউন

আমার ধারণা এটি আরও বহনযোগ্য। এছাড়াও, socketsপিএইচপি-তে মডিউল ইনস্টল এবং সক্ষম হওয়া উচিত উল্লেখ করা গুরুত্বপূর্ণ ।
ফ্যাবিও মন্টেফুসকলো

হ্যাঁ, থানকিউ @ আরনাড লে ব্ল্যাঙ্ক, এটি আমার জন্য খুব সহায়ক, আমি এই কৌশলটি দিয়ে আমার আইপি ঠিকানা পেয়েছি
আবিদ আলী

15

স্থানীয় দ্বারা আপনি কী বোঝাতে চান তা নির্ভর করে:

স্থানীয়ভাবে যদি আপনি পিএইচপি কোডটি কার্যকরকারী সার্ভার / সিস্টেমের ঠিকানা বলতে চান, তবে এখনও আলোচনা করার দুটি উপায় রয়েছে। যদি পিএইচপি কোনও ওয়েব সার্ভারের মাধ্যমে চলতে থাকে তবে আপনি পড়ার মাধ্যমে সার্ভারের ঠিকানা পেতে পারেন $_SERVER['SERVER_ADDR']। যদি পিএইচপি কোনও কমান্ড লাইন ইন্টারফেসের মাধ্যমে পরিচালিত হয়, তবে আপনাকে সম্ভবত শেল-এক্সিকিউট ipconfig(উইন্ডোজ) / ifconfig(* নিক্স) এবং ঠিকানাটি গ্রেপ করতে হবে।

স্থানীয়ভাবে যদি আপনি ওয়েবসাইটের দর্শকের দূরবর্তী ঠিকানা বোঝাতে চান তবে তাদের বাহ্যিক আইপি ঠিকানা নয় (যেহেতু আপনি নির্দিষ্টভাবে 192 বলেছিলেন। *), তবে আপনার ভাগ্য নেই। NAT রাউটিংয়ের পুরো পয়েন্টটি সেই ঠিকানাটি আড়াল করা। আপনি কোনও আইপি ঠিকানার পিছনে পৃথক কম্পিউটারের স্থানীয় ঠিকানাগুলি সনাক্ত করতে পারবেন না, তবে কিছু কৌশল (ব্যবহারকারীর এজেন্ট, সম্ভবত ম্যাক ঠিকানা) রয়েছে যা একই আইপি থেকে একাধিক কম্পিউটার অ্যাক্সেস করতে পারলে আলাদা করতে সহায়তা করতে পারে।


4
এবং সর্বশেষে তবে সর্বনিম্ন নয়, ipconfig / ifconfig সম্ভবত বেশ কয়েকটি আইপি ঠিকানা ফেরত পাঠায়: কারণ কোনও কম্পিউটারে সাধারণত একটি একক ঠিকানা থাকে না। দুর্দান্ত উত্তর।
আলভারো গঞ্জালেজ

হ্যাঁ NAT এর পুরো পয়েন্টটি হ'ল লোকাল আইপিটি আড়াল করার জন্য এখন তারা কী আপনার আভ্যন্তরীণ আইপি ঠিকানাটি জানে কি আইস্মিআইপি ডট কম , আপনার মোবাইল ব্যবহার করে এই ওয়েবসাইটটি খুলুন তারা আপনার মোবাইলগুলির স্থানীয় আইপি ঠিকানাও জানেন। সম্পাদনা: আমি জিওফাই রাউটার ব্যবহার করছি, আমি আইএমএল মোবাইল এন্ড্রয়েড 9 এওএসপি ভিত্তিক
রোমে

10

হোস্ট-নেম (1) আইপি ঠিকানা বলতে পারে: hostname --ip-addressবা যেমন মানুষ বলে, এটি ব্যবহার করা ভালhostname --all-ip-addresses


6

আপনি লিনাক্স হোস্টে সিআইএলিতে নিয়মিত ব্যবহারকারী হিসাবে এটি ব্যবহার করতে পারেন:

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()পরিবর্তে ব্যবহারের পরামর্শ দিন
থানু

5
$localIP = gethostbyname(trim(exec("hostname")));

আমি উইন্ডোজ পিসিতে এবং এর কাজ করে দেখেছি এবং এটিও লিনাক্সে কাজ করব বলে মনে করি।


4

এটি খুব সহজ এবং উপরের উত্তরগুলি জটিল জিনিস। কেবলমাত্র আপনি এই পদ্ধতিটি ব্যবহার করে স্থানীয় এবং সর্বজনীন আইপি ঠিকানাগুলি পেতে পারেন।

   <?php 
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;

$localIp = gethostbyname(gethostname());
echo $localIp;

?>

2

এটা সহজ এক। আপনি এই সাধারণ কোড দ্বারা হোস্টের নাম পেতে পারেন।

$ip = getHostByName(getHostName());

অথবা আপনি $_SERVER['HTTP_HOST']হোস্টের নাম পেতেও ব্যবহার করতে পারেন।


1

আমি এই প্রশ্নটি দিয়ে সার্ভার-সাইড পিএইচপি (লিনাক্স টার্মিনাল থেকে চলমান) দিয়ে গেছি

আমি '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

0

আপনি যদি ওএস এক্স-এর কোনও পরিবেশে থাকেন তবে ওয়াইফাইয়ের মাধ্যমে সংযুক্ত:

echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF মূলের সাথে সম্পর্কিত পাথের সাথে বর্তমান স্ক্রিপ্টের ফাইলের নাম ফেরত দেয়

  • SERVER_PROTOCOL পৃষ্ঠা-অনুরোধ করা প্রোটোকলের নাম এবং সংশোধন ফিরিয়ে দেয়

  • REQUEST_METHOD পৃষ্ঠাটি অ্যাক্সেস করতে ব্যবহৃত অনুরোধ পদ্ধতিটি ফেরত দেয়

  • DOCUMENT_ROOT বর্তমান স্ক্রিপ্টটি চালাচ্ছে সেই রুট ডিরেক্টরিটি ফিরিয়ে দেয়


সমস্ত সত্য, তবে জিজ্ঞাসা করা প্রশ্নে সমস্ত সম্পূর্ণ অপ্রাসঙ্গিক। -1।
মার্ক আমেরিকা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.