{"id":34687962,"url":"https://github.com/ilya-ruk/php-ipv4-filter","last_synced_at":"2026-05-28T19:01:46.972Z","repository":{"id":280966782,"uuid":"943226765","full_name":"Ilya-Ruk/php-ipv4-filter","owner":"Ilya-Ruk","description":"Определение принадлежности IP к РФ (зона RU)","archived":false,"fork":false,"pushed_at":"2025-03-06T08:39:09.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-06T09:38:13.697Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ilya-Ruk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-05T11:14:13.000Z","updated_at":"2025-03-06T08:41:12.000Z","dependencies_parsed_at":"2025-03-06T09:48:21.639Z","dependency_job_id":null,"html_url":"https://github.com/Ilya-Ruk/php-ipv4-filter","commit_stats":null,"previous_names":["ilya-ruk/php-ipv4-filter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Ilya-Ruk/php-ipv4-filter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilya-Ruk%2Fphp-ipv4-filter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilya-Ruk%2Fphp-ipv4-filter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilya-Ruk%2Fphp-ipv4-filter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilya-Ruk%2Fphp-ipv4-filter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ilya-Ruk","download_url":"https://codeload.github.com/Ilya-Ruk/php-ipv4-filter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilya-Ruk%2Fphp-ipv4-filter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33622070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-24T21:55:37.923Z","updated_at":"2026-05-28T19:01:46.967Z","avatar_url":"https://github.com/Ilya-Ruk.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Определение принадлежности IP к РФ (зона RU)\n\n## load_data.php\n\n1. Загружает список IPv4 относящихся к РФ (зона RU) по API из [RIPE](https://stat.ripe.net/data/country-resource-list/data.json?resource=RU).\n2. Дополняет список IP частных сетей (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 и 127.0.0.0/8).\n3. Преобразует во внутренний формат (см. описание формата ниже).\n4. Сохраняет в файле ip_ru.bin (ровно 512 Мб.).\n\n## test_ip.php\n\nПроверяет указанный в параметре IP на принадлежность к РФ (зона RU) или к частной сети (см. описание алгоритма проверки ниже).\nЕсли IP не указан, выводит проверку для нескольких тестовых IP указанных в скрипте.\nВ выводе присутствует отладочная информация: IP, его целочисленное представление, номер блока, номер байта, номер бита, а также время проверки в микросекундах.\n\n## Внутренний формат файла ip_ru.bin\n\nДля IPv4 всего может быть 2^32 IP адресов или 4294967296.\nТак как нам требуется ответить на вопрос \"относится IP к РФ (частной сети) или нет?\", нам достаточно хранить 0 или 1 для каждого возможного IP (0 - не относится, 1 - относится).\nСоответственно, нам достаточно одного бита на каждый IP адрес.\nВсе адреса, не относящиеся к РФ (частной сети), заполняем 0.\nВсе адреса, относящиеся к РФ (частной сети), заполняем 1.\nУпаковываем в байты (беззнаковый char) и сохраняем на диске.\nРазмер файла составит ровно 512 Мб (4294967296 адресов / 8 бит).\n\nДля проверки достаточно будет проверить нужный бит, который расположен в файле со смещением равным IP (предварительно преобразованным к беззнаковому int).\n\nДля выполнения проверки за минимальное время, чтение с диска (HDD) должно осуществляться блоком с размером, как правило, 4096 байт.\nДля SSD можно читать только нужный байт.\n\n## Алгоритм проверки\n\n1. Открываем файл ip_ru.bin\n\n```php\n$fileName = 'ip_ru.bin';\n\n$fd = fopen($fileName, 'rb');\n```\n\n2. Преобразуем тестируемый IP к беззнаковому int\n\n```php\n$ipInt = ipToInt($ip);\n```\n\n3. Определяем номер блока, который нужно прочитать с диска\n\n```php\n$blockSize = 4096;\n\n$bitsPerBlock = $blockSize * 8;\n\n$blockNumber = (int)floor((float)$ipInt / $bitsPerBlock);\n```\n\n4. Смещаемся в файле к началу нужного блока\n\n```php\nfseek($fd, $blockNumber * $blockSize)\n```\n\n5. Читаем блок с диска\n\n```php\n$blockData = fread($fd, $blockSize);\n```\n\n6. Определяем номер байта в блоке\n\n```php\n$blockOffset = $ipInt - $blockNumber * $bitsPerBlock;\n\n$byteNumber = (int)floor((float)$blockOffset / 8);\n```\n\n7. Получаем значение нужного байта и распаковываем его из формата хранения на диске (беззнаковый char)\n\n```php\n$byte = unpack('C', $blockData[$byteNumber])[1];\n```\n\n8. Определяем номер бита в байте\n\n```php\n$bitNumber = $blockOffset - $byteNumber * 8;\n```\n\n9. Проверяем нужный бит\n\n```php\nreturn ($byte \u0026 (1 \u003c\u003c $bitNumber));\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filya-ruk%2Fphp-ipv4-filter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filya-ruk%2Fphp-ipv4-filter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filya-ruk%2Fphp-ipv4-filter/lists"}