>  기사  >  백엔드 개발  >  PHP 및 GraphQL을 사용하여 효율적인 API 데이터 쿼리 및 작업 달성

PHP 및 GraphQL을 사용하여 효율적인 API 데이터 쿼리 및 작업 달성

WBOY
WBOY원래의
2023-06-25 11:23:271145검색

인터넷 기술이 지속적으로 발전하면서 API는 다양한 소프트웨어가 서로 통신하는 중요한 방법이 되었습니다. API는 서로 다른 소프트웨어가 서로 액세스하고 사용할 수 있도록 통합된 데이터 인터페이스를 제공할 수 있습니다. 그러나 API의 수와 규모가 계속해서 증가함에 따라 API 데이터에 대한 쿼리와 연산을 어떻게 빠르고 효율적으로 처리할 것인가가 중요한 문제로 대두되고 있습니다.

이 문제에서는 PHP와 GraphQL이 매우 효과적인 솔루션을 제공할 수 있습니다. 이 문서에서는 이 솔루션에 대한 간략한 소개와 분석을 제공합니다.

PHP 개요

PHP는 범용 오픈 소스 스크립팅 언어로, 특히 웹 개발에 적합하며 HTML에 포함될 수 있습니다. 다른 프로그래밍 언어와 달리 PHP의 구문은 상대적으로 시작하기가 쉽기 때문에 많은 초보자가 선택하는 언어가 되었습니다. 동시에 PHP는 강력한 프로그래밍 기능을 갖추고 있어 다양하고 복잡한 작업을 쉽게 처리할 수 있습니다.

PHP의 장점과 단점

PHP의 장점은 다음과 같습니다.

  • 시작하기 쉬움: PHP의 구문은 상대적으로 간단하며 많은 초보자가 빠르게 시작할 수 있습니다.
  • 크로스 플랫폼 사용: PHP는 Windows, Linux, MacOS 등을 포함한 대부분의 운영 체제에서 실행될 수 있습니다.
  • 오픈 소스 지원: PHP는 대규모 커뮤니티와 활동적인 개발자가 있는 완전한 오픈 소스 프로젝트입니다.
  • 우수한 확장성: PHP는 MySQL 확장, SOAP 확장 등과 같은 다양한 확장을 사용하여 기능을 향상시킬 수 있습니다.
  • HTML에 포함 가능: PHP는 HTML에 포함되어 웹 개발을 용이하게 할 수 있습니다.

PHP의 단점은 다음과 같습니다.

  • 낮은 코드 가독성: PHP의 코드는 일반적으로 밀도가 높으며 다른 언어만큼 읽기 쉽지 않습니다.
  • 제한된 성능: 동적 해석의 특성으로 인해 PHP의 성능은 상대적으로 낮습니다.
  • 낮은 보안: PHP에는 SQL 주입, XSS 공격 등과 같은 일부 보안 위험이 있습니다.

GraphQL 개요

GraphQL은 API 쿼리 및 운영에 사용할 수 있는 데이터 쿼리 언어이자 런타임 환경입니다. 원래 Facebook에서 개발하여 2015년에 공개적으로 출시되었습니다. GraphQL의 핵심 아이디어는 클라이언트가 필요한 데이터를 지정할 수 있도록 하여 불필요한 네트워크 트래픽과 서버 부하를 줄이는 것입니다.

GraphQL의 장점과 단점

GraphQL의 장점은 다음과 같습니다.

  • 강력한 유연성: GraphQL을 사용하면 클라이언트가 데이터 쿼리 및 반환 방법을 사용자 정의할 수 있으며 이는 기존 REST API보다 더 유연합니다.
  • 중첩 가능: GraphQL은 필요에 따라 데이터를 중첩하고 필요에 따라 여러 쿼리를 수행하여 쿼리 효율성을 향상시킬 수 있습니다.
  • 템플릿: GraphQL의 스키마는 사용 가능한 데이터 및 데이터 유형에 대한 템플릿을 정의하여 개발 효율성을 향상시킵니다.
  • 클라이언트 제어: GraphQL을 사용하면 클라이언트가 API에서 반환된 데이터를 제어하여 불필요한 데이터 전송 및 기존 API의 기타 문제를 피할 수 있습니다.

GraphQL의 단점은 다음과 같습니다.

  • 높은 학습 비용: REST API에 비해 GraphQL은 학습 비용이 더 높으며 언어와 개념을 배우는 데 더 많은 시간이 필요합니다.
  • 교차 도메인 액세스 제한: 보안상의 이유로 브라우저의 JavaScript API는 GraphQL API 크로스 도메인에 액세스할 수 없습니다.
  • 낮은 디버깅 가능성: GraphQL의 쿼리 및 반환 메서드는 유연하기 때문에 디버깅이 어렵습니다.

PHP와 GraphQL을 사용하여 효율적인 API 데이터 쿼리 및 작업을 달성하는 방법은 무엇입니까?

PHP와 GraphQL을 함께 사용하면 API 쿼리 및 작업 효율성을 향상시킬 수 있습니다. 다음은 구현 방법 중 하나입니다.

1단계: GraphQL 스키마 생성

GraphQL 스키마는 데이터 유형과 작업을 정의하는 템플릿으로, API에서 지원하는 데이터 유형과 실행 가능한 작업을 지정하는 데 사용됩니다. GraphQL의 스키마를 사용한 후 해당 모델에서 작동하는 쿼리 언어를 사용할 수 있습니다.

다음 스키마를 생성할 수 있습니다.

type Book {
    id: ID!
    title: String!
    author: String!
    publisher: String!
    price: Float!
}

type Query {
    getBook(id: ID!): Book
    getAllBooks: [Book]
}

type Mutation {
    addBook(title: String!, author: String!, publisher: String!, price: Float!): ID!
    updateBook(id: ID!, title: String, author: String, publisher: String, price: Float): Book
    deleteBook(id: ID!): Boolean
}

2단계: GraphQL 실행기 구현

GraphQL 실행기는 쿼리, 변형, 구독과 같은 작업을 수행할 수 있습니다. PHP를 사용하여 GraphQL의 실행기를 구현할 수 있습니다. 다음은 간단한 예입니다.

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use GraphQLTypeSchema;
use GraphQLTypeDefinitionObjectType;
use GraphQLTypeDefinitionType;
use GraphQLGraphQL;
use GraphQLTypeDefinitionResolveInfo;

$db = mysqli_connect('localhost', 'root', '', 'books');
mysqli_query($db, "SET NAMES 'UTF8'");

$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'getBook' => [
            'type' => $bookType,
            'args' => [
                'id' => Type::nonNull(Type::id())
            ],
            'resolve' => function ($root, $args) use ($db) {
                $result = mysqli_query($db, "SELECT * FROM books WHERE id = {$args['id']}");
                $book = mysqli_fetch_assoc($result);
                return $book;
            }
        ],
        'getAllBooks' => [
            'type' => Type::listOf($bookType),
            'resolve' => function ($root, $args) use ($db) {
                $result = mysqli_query($db, "SELECT * FROM books");
                $books = mysqli_fetch_all($result, MYSQLI_ASSOC);
                return $books;
            }
        ]
    ]
]);

$mutationType = new ObjectType([
    'name' => 'Mutation',
    'fields' => [
        'addBook' => [
            'type' => Type::id(),
            'args' => [
                'title' => Type::nonNull(Type::string()),
                'author' => Type::nonNull(Type::string()),
                'publisher' => Type::nonNull(Type::string()),
                'price' => Type::nonNull(Type::float())
            ],
            'resolve' => function ($root, $args) use ($db) {
                $result = mysqli_query($db, "INSERT INTO books (title, author, publisher, price) VALUES ('{$args['title']}', '{$args['author']}', '{$args['publisher']}', {$args['price']})");
                $id = mysqli_insert_id($db);
                return $id;
            }
        ],
        'updateBook' => [
            'type' => $bookType,
            'args' => [
                'id' => Type::nonNull(Type::id()),
                'title' => Type::string(),
                'author' => Type::string(),
                'publisher' => Type::string(),
                'price' => Type::float()
            ],
            'resolve' => function ($root, $args) use ($db) {
                $sql = "UPDATE books SET";
                if (!is_null($args['title'])) $sql .= " title='{$args['title']}',";
                if (!is_null($args['author'])) $sql .= " author='{$args['author']}',";
                if (!is_null($args['publisher'])) $sql .= " publisher='{$args['publisher']}',";
                if (!is_null($args['price'])) $sql .= " price={$args['price']},";
                $sql = rtrim($sql, ',');
                $sql .= " WHERE id = {$args['id']}";
                mysqli_query($db, $sql);
                $result = mysqli_query($db, "SELECT * FROM books WHERE id = {$args['id']}");
                $book = mysqli_fetch_assoc($result);
                return $book;
            }
        ],
        'deleteBook' => [
            'type' => Type::boolean(),
            'args' => [
                'id' => Type::nonNull(Type::id())
            ],
            'resolve' => function ($root, $args) use ($db) {
                mysqli_query($db, "DELETE FROM books WHERE id = {$args['id']}");
                return true;
            }
        ],
    ]
]);

$bookType = new ObjectType([
    'name' => 'Book',
    'fields' => [
        'id' => [
            'type' => Type::nonNull(Type::id())
        ],
        'title' => [
            'type' => Type::nonNull(Type::string())
        ],
        'author' => [
            'type' => Type::nonNull(Type::string())
        ],
        'publisher' => [
            'type' => Type::nonNull(Type::string())
        ],
        'price' => [
            'type' => Type::nonNull(Type::float())
        ],
    ]
]);

$schema = new Schema([
    'query' => $queryType,
    'mutation' => $mutationType
]);

$input = file_get_contents('php://input');

try {
    $result = GraphQL::executeQuery($schema, $input);
    echo json_encode($result->toArray());
} catch (Exception $e) {
    echo json_encode([
        'error' => [
            'message' => $e->getMessage()
        ]
    ]);
}
?>

이 PHP 스크립트에서는 GraphQL 스키마를 생성하고 getBook, getAllBooks 및 addBook, updateBook, deleteBook(Mutation에 정의됨)의 세 가지 요청을 정의했습니다. 이러한 요청은 쿼리는 물론 추가, 업데이트, 삭제라는 세 가지 변형 작업도 제공합니다. MySQL 데이터베이스에 저장할 수 있습니다. 런타임 시 쿼리 문을 실행하여 요청을 처리합니다.

3단계: GraphQL 클라이언트 개발

이 단계에서 클라이언트는 PHP 스크립트를 사용하여 쿼리(또는 변형) 문을 자동으로 생성할 수 있습니다. 즉, 클라이언트는 코드를 직접 작성할 필요가 없으며 웹 양식이나 UI를 사용하지 않고도 GraphQL 쿼리를 빠르게 구축할 수 있습니다. 다음 PHP 라이브러리를 사용하여 구현할 수 있습니다.

composer require  webonyx/graphql-php

다음은 간단한 PHP GraphQL 클라이언트 예입니다.

<?php
require_once(__DIR__ . '/vendor/autoload.php');
use GraphQLClient;
use GraphQLQuery;
use GraphQLVariable;

$client = new Client('http://localhost/graphql.php', [
  'headers' => [
      'Content-Type' => 'application/json',
      'Accept' => 'application/json',
  ],
]);

// 查询所有书籍
$queryAllBooks = new Query('getAllBooks', [], [
    'id',
    'title',
    'author',
    'publisher',
    'price'
]);
$response = $client->runQuery($queryAllBooks);
var_dump($response);

// 查询某本书
$queryBook = new Query('getBook', [
    new Variable('id', 'ID!', '1')
], [
    'id',
    'title',
    'author',
    'publisher',
    'price'
]);
$response = $client->runQuery($queryBook);
var_dump($response);

// 添加一本新书
$mutationAddBook = new Query('addBook', [
    new Variable('title', 'String!', 'PHP Programming'),
    new Variable('author', 'String!', 'John Doe'),
    new Variable('publisher', 'String!', 'Publisher 123'),
    new Variable('price', 'Float!', 123.45)
], [
    'id'
]);
$response = $client->runQuery($mutationAddBook);
var_dump($response);

// 更新一本书
$mutationUpdateBook = new Query('updateBook', [
    new Variable('id', 'ID!', 1),
    new Variable('title', 'String', 'PHP Programming'),
    new Variable('author', 'String', 'John Doe'),
    new Variable('publisher', 'String', 'Publisher 321'),
    new Variable('price', 'Float', 123.45)
], [
    'id',
    'title',
    'author',
    'publisher',
    'price'
]);
$response = $client->runQuery($mutationUpdateBook);
var_dump($response);

// 删除一本书
$mutationDeleteBook = new Query('deleteBook', [
    new Variable('id', 'ID!', 1),
], [
    'id'
]);
$response = $client->runQuery($mutationDeleteBook);
var_dump($response);
?>

이 클라이언트 스크립트에서는 getAllBooks, getBook, addBook, updateBook 및 deleteBook의 5개 요청을 정의합니다. 이러한 요청은 GraphQL API에서 수행되는 가장 일반적인 작업을 다룹니다.

최종 생각

PHP와 GraphQL의 조합은 API 쿼리 및 작업을 효율적으로 처리하기 위한 솔루션을 제공합니다. 웹 프로그래밍 언어로서 PHP는 서버 측 비즈니스 로직을 처리하는 데 적합하며 GraphQL은 클라이언트 제어 및 템플릿 아키텍처를 통해 데이터 전송량을 줄이고 쿼리 효율성을 향상시킬 수 있습니다. 위의 세 단계를 통해 API 개발에서 PHP와 GraphQL의 애플리케이션 시나리오를 더 잘 이해할 수 있으며, 더 스마트하고 효율적인 API를 만들 수도 있습니다.

위 내용은 PHP 및 GraphQL을 사용하여 효율적인 API 데이터 쿼리 및 작업 달성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.