{"id":21424805,"url":"https://github.com/opentelemetry-php/context-swoole","last_synced_at":"2025-07-14T08:31:57.868Z","repository":{"id":114509119,"uuid":"571866938","full_name":"opentelemetry-php/context-swoole","owner":"opentelemetry-php","description":"[READONLY] Swoole context","archived":false,"fork":false,"pushed_at":"2025-03-12T10:22:35.000Z","size":18,"stargazers_count":6,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-01T23:48:43.117Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opentelemetry-php.png","metadata":{"files":{"readme":"README-zh_CN.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2022-11-29T03:41:17.000Z","updated_at":"2025-05-13T14:41:25.000Z","dependencies_parsed_at":"2024-11-15T22:39:29.551Z","dependency_job_id":"24fd0156-608b-44af-a55a-cb9347472aed","html_url":"https://github.com/opentelemetry-php/context-swoole","commit_stats":{"total_commits":3,"total_committers":1,"mean_commits":3.0,"dds":0.0,"last_synced_commit":"0133493a65b65f929a70720a67ee6fe9d94ede24"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/opentelemetry-php/context-swoole","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opentelemetry-php%2Fcontext-swoole","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opentelemetry-php%2Fcontext-swoole/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opentelemetry-php%2Fcontext-swoole/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opentelemetry-php%2Fcontext-swoole/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opentelemetry-php","download_url":"https://codeload.github.com/opentelemetry-php/context-swoole/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opentelemetry-php%2Fcontext-swoole/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265262625,"owners_count":23736433,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":"2024-11-22T21:24:39.253Z","updated_at":"2025-07-14T08:31:56.304Z","avatar_url":"https://github.com/opentelemetry-php.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Releases](https://img.shields.io/badge/releases-purple)](https://github.com/opentelemetry-php/context-swoole/releases)\n[![Issues](https://img.shields.io/badge/issues-pink)](https://github.com/open-telemetry/opentelemetry-php/issues)\n[![Source](https://img.shields.io/badge/source-contrib-green)](https://github.com/open-telemetry/opentelemetry-php-contrib/tree/main/src/Context/Swoole)\n[![Mirror](https://img.shields.io/badge/mirror-opentelemetry--php--contrib-blue)](https://github.com/opentelemetry-php/context-swoole)\n[![Latest Version](http://poser.pugx.org/open-telemetry/context-swoole/v/unstable)](https://packagist.org/packages/open-telemetry/context-swoole/)\n[![Stable](http://poser.pugx.org/open-telemetry/context-swoole/v/stable)](https://packagist.org/packages/open-telemetry/context-swoole/)\n\nThis is a read-only subtree split of \u003chttps://github.com/open-telemetry/opentelemetry-php-contrib\u003e.\n\n# OpenTelemetry Swoole context\n\n[简体中文](README-zh_CN.md) | [ENGLISH](README.md)\n\n不同于传统的 php-fpm 运行时单个进程同一时刻只处理一个请求，在 Swoole 中每个进程同时会处理多个 http 请求，这个库解决在 Swoole 中使用 Opentelemetry 的上下文切换问题。\n\n## Requirement\n\n* php \u003e= 8.0\n* swoole \u003e= 4.5\n\n## 安装\n\nInstall the package with composer:\n\n```bash\ncomposer require open-telemetry/context-swoole\n```\n\n请注意，该库需要与 OpenTelemetry 配合使用，例如 `open-telemetry/opentelemetry`.\n\n## 使用\n\n基于 docker 快速启动 jaeger\n\n```bash\ndocker run -d --name jaeger \\\n  -p 16686:16686 \\\n  -p 4318:4318 \\\n  -p 4317:4317 \\\n  jaegertracing/all-in-one\n```\n\n注册 `TracerProvider` 并启动 Swoole http server:\n\n```php\n\u003c?php\n\nuse OpenTelemetry\\API\\Globals;\nuse OpenTelemetry\\API\\Instrumentation\\Configurator;\nuse OpenTelemetry\\API\\Trace\\SpanKind;\nuse OpenTelemetry\\Context\\Context;\nuse OpenTelemetry\\Context\\ContextStorage;\nuse OpenTelemetry\\Contrib\\Context\\Swoole\\SwooleContextStorage;\nuse OpenTelemetry\\Contrib\\Otlp\\OtlpHttpTransportFactory;\nuse OpenTelemetry\\Contrib\\Otlp\\SpanExporter;\nuse OpenTelemetry\\SDK\\Trace\\SpanProcessor\\SimpleSpanProcessor;\nuse OpenTelemetry\\SDK\\Trace\\TracerProvider;\nuse Swoole\\Http\\Server;\n\nrequire __DIR__ . '/vendor/autoload.php';\n\n// Create a tracer provider with the exporter and processor\n$transport = (new OtlpHttpTransportFactory())-\u003ecreate('http://127.0.0.1:4318/v1/traces', 'application/json');\n$exporter = new SpanExporter($transport);\n$spanProcessor = new SimpleSpanProcessor($exporter);\n$tracerProvider = new TracerProvider($spanProcessor);\n\n// Use Swoole context storage\nContext::setStorage(new SwooleContextStorage(new ContextStorage()));\n\n// Register the tracer provider\nGlobals::registerInitializer(fn(Configurator $configurator) =\u003e $configurator-\u003ewithTracerProvider($tracerProvider));\n\n// Create a Swoole HTTP server, which will start on local port 9501\n$http = new Server('127.0.0.1', 9501);\n\n// Http request callback\n$http-\u003eon('request', function ($request, $response) {\n    $tracer = Globals::tracerProvider()-\u003egetTracer('io.opentelemetry.contrib.swoole.php');\n\n    try {\n        $root = $tracer-\u003espanBuilder($request-\u003eserver['request_uri'])\n            -\u003esetSpanKind(SpanKind::KIND_SERVER)\n            -\u003estartSpan();\n        $scope = $root-\u003eactivate();\n\n        for ($i = 0; $i \u003c 3; $i++) {\n            // start a span, register some events\n            $span = $tracer-\u003espanBuilder('loop-' . $i)-\u003estartSpan();\n\n            $span\n                -\u003esetAttribute('remote_ip', '1.2.3.4')\n                -\u003esetAttribute('country', 'USA');\n\n            $span-\u003eaddEvent('found_login' . $i, [\n                'id' =\u003e $i,\n                'username' =\u003e 'otuser' . $i,\n            ]);\n            $span-\u003eaddEvent('generated_session', [\n                'id' =\u003e md5((string) microtime(true)),\n            ]);\n\n            $span-\u003eend();\n        }\n    } finally {\n        $root-\u003eend();\n        $scope-\u003edetach();\n    }\n\n    $response-\u003eheader('Content-Type', 'text/plain');\n    $response-\u003eend('Hello Swoole Context');\n});\n\n// Start server\n$http-\u003estart();\n```\n\n使用以下命令进行访问测试:\n\n```bash\ncurl -i 127.0.0.1:9501/swoole-context-demo\n```\n\n最后打开浏览器访问 jaeger UI: \u003chttp://127.0.0.1:16686/\u003e 查询链路信息。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopentelemetry-php%2Fcontext-swoole","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopentelemetry-php%2Fcontext-swoole","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopentelemetry-php%2Fcontext-swoole/lists"}