Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Profiling PHP @ HackYeah 2019

Profiling PHP @ HackYeah 2019

You cannot improve what you cannot measure. That's why profiling applications should always be the first step before trying to improve its performance. Learn how to spot your applications' bottlenecks and how to adopt profiling into your developer pipeline.

Sebastian Grodzicki

September 14, 2019
Tweet

More Decks by Sebastian Grodzicki

Other Decks in Programming

Transcript

  1. Profiling PHP
    Sebastian Grodzicki @ HackYeah 2019
    @sebgrodzicki

    View Slide

  2. Who is a developer?
    ȱȱȱȱȱȱȱȱȱȱ

    View Slide

  3. Who is not a developer?
    ȱȱȱȱȱȱȱȱȱȱ

    View Slide

  4. Who uses PHP?
    ȱȱȱȱȱȱȱȱȱȱ

    View Slide

  5. Who uses PHPUnit?
    ȱȱȱȱȱȱȱȱȱȱ

    View Slide

  6. Who is already profiling PHP?
    ȱȱȱȱȱȱȱȱȱȱ

    View Slide

  7. Who uses Blackfire?
    ȱȱȱȱȱȱȱȱȱȱ

    View Slide

  8. phpinfo();
    Sebastian Grodzicki

    • Engineering Manager at
    • ex-CTO at SHOWROOM & GoldenLine
    • PHP developer for 15+ years
    • #perfmatters
    @sebgrodzicki

    View Slide

  9. SHOWROOM

    View Slide

  10. SHOWROOM

    View Slide

  11. You cannot improve what you
    cannot measure.

    View Slide

  12. APM
    Application Performance Monitoring

    View Slide

  13. Google Analytics

    View Slide

  14. AWS CloudWatch

    View Slide

  15. AWS CloudWatch

    View Slide

  16. AWS CloudWatch

    View Slide

  17. AWS CloudWatch

    View Slide

  18. AWS Athena

    View Slide

  19. AWS X-Ray

    View Slide

  20. AWS X-Ray

    View Slide

  21. Nginx
    log_format apm '$upstream_response_time';
    access_log /var/log/nginx/access.log apm;

    View Slide

  22. Elastic Stack

    View Slide

  23. New Relic

    View Slide

  24. Datadog

    View Slide

  25. AppDynamics

    View Slide

  26. Dynatrace

    View Slide

  27. SolarWinds

    View Slide

  28. You cannot improve what you
    cannot measure.

    View Slide

  29. Profiling

    View Slide

  30. Speaker Deck

    View Slide

  31. View Slide

  32. View Slide

  33. View Slide

  34. View Slide

  35. View Slide

  36. View Slide

  37. View Slide

  38. View Slide

  39. View Slide

  40. View Slide

  41. View Slide

  42. View Slide

  43. View Slide

  44. View Slide

  45. View Slide

  46. View Slide

  47. View Slide

  48. View Slide

  49. View Slide

  50. View Slide

  51. View Slide

  52. tests:


    "Application should never hit the DB":

    path: "/.*"

    assertions:

    - "metrics.sql.queries.count == 0"



    "Homepage should never call the API":

    path: "/"

    assertions:

    - "metrics.http.requests.count == 0"



    "Pages should be fast enough":

    path: "/.*"

    assertions:

    - "main.wall_time < 100ms"

    .blackfire.yml

    View Slide

  53. View Slide

  54. View Slide

  55. View Slide

  56. View Slide

  57. View Slide

  58. View Slide

  59. View Slide

  60. public function getSingleMetaForChannel(string $path): SeoMeta

    {


    $data = $this->client->getSingleMetaForChannel(null, $path);



    if (isset($data[$path])) {

    return SeoMeta::createFromSdk($data[$path]);

    }

    throw new NotFoundException("Meta for path ${path} not found");

    }
    SeoRepository.php

    View Slide


  61. namespace Repository;


    use ValueObject\SeoMeta;


    interface SeoRepositoryInterface

    {

    public function getSingleMetaForChannel(string $path): SeoMeta;

    }
    SeoRepositoryInterface.php

    View Slide

  62. public function getSingleMetaForChannel(string $path): SeoMeta

    {


    $options = [

    'lang' => self::MAP_CHANNEL_LOCALE[$this->channel],

    'orderings' => '[document.last_publication_date desc]',

    ];



    $document = $this->client->findOneByPath(

    'seo__content',

    $path,

    $options

    );



    if (null === $document) {

    throw new NotFoundException("Meta for path {$path} not found");

    }



    return new SeoMeta($document);

    }
    PrismicSeoRepository.php

    View Slide

  63. View Slide

  64. View Slide

  65. View Slide

  66. View Slide

  67. CLI
    Command Line Interface

    View Slide


  68. $start = hrtime(true);


    sleep(3);


    $stop = hrtime(true);


    error_log(($stop - $start) / 1e+9);
    hackyeah.php

    View Slide

  69. $ php hackyeah.php


    3.002292529
    CLI

    View Slide

  70. $ blackfire run php hackyeah.php 


    3.00448906


    Blackfire Run completed

    Graph URL https://blackfire.io/profiles/4ae6c42b-
    b051-41bd-8ef9-65545bdf0c34/graph

    No tests! Create some now https://blackfire.io/docs/
    cookbooks/tests

    No recommendations


    Wall Time 3.01s

    I/O Wait n/a

    CPU Time n/a

    Memory 40.7KB

    Network n/a n/a n/a

    SQL n/a n/a
    CLI

    View Slide

  71. View Slide

  72. View Slide

  73. Are you still with me? :)

    View Slide

  74. GoldenLine

    View Slide

  75. Increasing e-mail throughput by 110%

    View Slide

  76. Increasing e-mail throughput by 110%

    View Slide

  77. Increasing e-mail throughput by 110%

    View Slide

  78. swiftmailer:

    default_mailer: default

    mailers:

    default:

    transport: aws.ses.transport

    spool: { type: db }

    config.yml

    View Slide

  79. Increasing e-mail throughput by 110%

    View Slide

  80. Increasing e-mail throughput by 110%

    View Slide

  81. Blackfire's book to PHP Performance

    View Slide

  82. Questions?

    View Slide

  83. Thank you!

    View Slide

  84. FREE BOOKS

    View Slide